Switch to LoadScopedPage()

Bug: 354025368
Change-Id: Ie6bbf7d2df60bc942566650dcfafd2fb38532d4b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/124010
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
diff --git a/AUTHORS b/AUTHORS
index abd91f7..74d839a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -22,6 +22,7 @@
 Dorian Rudolph <dorianrudo97@gmail.com>
 Felix Kauselmann <licorn@gmail.com>
 GiWan Go <gogil@stealien.com>
+Helmut Januschka <helmut@januschka.com>
 Huy Ngo <huyna89@gmail.com>
 Ivan Odulo <ivanodulo@gmail.com>
 Jiang Jiang <jiangj@opera.com>
diff --git a/core/fpdfapi/edit/cpdf_creator_embeddertest.cpp b/core/fpdfapi/edit/cpdf_creator_embeddertest.cpp
index 741401c..41b5959 100644
--- a/core/fpdfapi/edit/cpdf_creator_embeddertest.cpp
+++ b/core/fpdfapi/edit/cpdf_creator_embeddertest.cpp
@@ -28,12 +28,11 @@
   {
     // Do some read only operations.
     ASSERT_GE(1, FPDF_GetPageCount(document()));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     EXPECT_EQ(595, FPDFBitmap_GetWidth(bitmap.get()));
     EXPECT_EQ(842, FPDFBitmap_GetHeight(bitmap.get()));
-    UnloadPage(page);
   }
 
   // Save when we have additional loaded data.
diff --git a/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp b/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp
index 17ac00f..cb75956 100644
--- a/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp
@@ -17,9 +17,7 @@
 TEST_F(CPDFParserEmbedderTest, Bug481363) {
   // Test colorspace object with malformed dictionary.
   ASSERT_TRUE(OpenDocument("bug_481363.pdf"));
-  FPDF_PAGE page = LoadPage(0);
-  EXPECT_TRUE(page);
-  UnloadPage(page);
+  EXPECT_TRUE(LoadScopedPage(0));
 }
 
 TEST_F(CPDFParserEmbedderTest, Bug544880) {
@@ -43,15 +41,14 @@
   // Test the case that cross reference entries, which are well formed,
   // but do not match with the objects.
   ASSERT_TRUE(OpenDocument("bug_602650.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   EXPECT_TRUE(text_page);
   // The page should not be blank.
   EXPECT_LT(0, FPDFText_CountChars(text_page));
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(CPDFParserEmbedderTest, Bug757705) {
@@ -64,21 +61,19 @@
   // check that the second page was correctly loaded. Because it is contains
   // crossrefs for second page.
   EXPECT_EQ(2, GetPageCount());
-  FPDF_PAGE page = LoadPage(1);
+  ScopedEmbedderTestPage page = LoadScopedPage(1);
   EXPECT_TRUE(page);
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   EXPECT_TRUE(text_page);
   // The page should not be blank.
   EXPECT_LT(0, FPDFText_CountChars(text_page));
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(CPDFParserEmbedderTest, Bug828049) {
   ASSERT_TRUE(OpenDocument("bug_828049.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  UnloadPage(page);
 }
 
 // crbug.com/1191313
diff --git a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
index 0bef0f8..8b0617d 100644
--- a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
@@ -44,9 +44,8 @@
   void OpenAndVerifyHelloWorldDocumentWithPassword(const char* filename,
                                                    const char* password) {
     ASSERT_TRUE(OpenDocumentWithPassword(filename, password));
-    FPDF_PAGE page = LoadPage(0);
-    VerifyHelloWorldPage(page);
-    UnloadPage(page);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    VerifyHelloWorldPage(page.get());
   }
 
   void VerifySavedHelloWorldDocumentWithPassword(const char* password) {
@@ -79,15 +78,14 @@
   }
 
   void RemoveGoodbyeObject() {
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     {
-      ScopedFPDFPageObject goodbye_object(FPDFPage_GetObject(page, 1));
+      ScopedFPDFPageObject goodbye_object(FPDFPage_GetObject(page.get(), 1));
       ASSERT_TRUE(goodbye_object);
-      ASSERT_TRUE(FPDFPage_RemoveObject(page, goodbye_object.get()));
+      ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), goodbye_object.get()));
     }
-    ASSERT_TRUE(FPDFPage_GenerateContent(page));
-    VerifyModifiedHelloWorldPage(page);
-    UnloadPage(page);
+    ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
+    VerifyModifiedHelloWorldPage(page.get());
   }
 
  private:
@@ -162,19 +160,18 @@
     ASSERT_TRUE(OpenDocumentWithOptions("encrypted.pdf", "5678",
                                         LinearizeOption::kMustLinearize,
                                         JavaScriptOption::kEnableJavaScript));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
     FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(10, 10, 20, 20);
     ASSERT_TRUE(red_rect);
     EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255));
     EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0));
-    FPDFPage_InsertObject(page, red_rect);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    FPDFPage_InsertObject(page.get(), red_rect);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 612, 792, checksum);
-    EXPECT_TRUE(FPDFPage_GenerateContent(page));
+    EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
     SetWholeFileAvailable();
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-    UnloadPage(page);
   }
   std::string new_file = GetString();
   FPDF_FILEACCESS file_access = {};  // Aggregate initialization.
diff --git a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
index e5b8b05..4be2012 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
@@ -17,32 +17,29 @@
   // Tests specifying multiple image filters for a stream. Should not cause a
   // crash when rendered.
   ASSERT_TRUE(OpenDocument("bug_552046.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 612, 792, kBlankPage612By792Checksum);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFParserDecodeEmbedderTest, Bug555784) {
   // Tests bad input to the run length decoder that caused a heap overflow.
   // Should not cause a crash when rendered.
   ASSERT_TRUE(OpenDocument("bug_555784.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 612, 792, kBlankPage612By792Checksum);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFParserDecodeEmbedderTest, Bug455199) {
   // Tests object numbers with a value > 01000000.
   // Should open successfully.
   ASSERT_TRUE(OpenDocument("bug_455199.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
 
   CompareBitmap(bitmap.get(), 200, 200, pdfium::HelloWorldChecksum());
-  UnloadPage(page);
 }
diff --git a/core/fpdfapi/render/fpdf_progressive_render_embeddertest.cpp b/core/fpdfapi/render/fpdf_progressive_render_embeddertest.cpp
index 702c1cd..b6c40c7 100644
--- a/core/fpdfapi/render/fpdf_progressive_render_embeddertest.cpp
+++ b/core/fpdfapi/render/fpdf_progressive_render_embeddertest.cpp
@@ -236,70 +236,67 @@
   // Test rendering of page content using progressive render APIs
   // without pausing the rendering.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   FakePause pause(false);
-  EXPECT_TRUE(StartRenderPage(page, &pause));
-  ScopedFPDFBitmap bitmap = FinishRenderPage(page);
+  EXPECT_TRUE(StartRenderPage(page.get(), &pause));
+  ScopedFPDFBitmap bitmap = FinishRenderPage(page.get());
   CompareBitmap(bitmap.get(), 595, 842,
                 AnnotationStampWithApBaseContentChecksum());
-  UnloadPage(page);
 }
 
 TEST_F(FPDFProgressiveRenderEmbedderTest, RenderWithPause) {
   // Test rendering of page content using progressive render APIs
   // with pause in rendering.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   FakePause pause(true);
-  bool render_done = StartRenderPage(page, &pause);
+  bool render_done = StartRenderPage(page.get(), &pause);
   EXPECT_FALSE(render_done);
 
   while (!render_done) {
-    render_done = ContinueRenderPage(page, &pause);
+    render_done = ContinueRenderPage(page.get(), &pause);
   }
-  ScopedFPDFBitmap bitmap = FinishRenderPage(page);
+  ScopedFPDFBitmap bitmap = FinishRenderPage(page.get());
   CompareBitmap(bitmap.get(), 595, 842,
                 AnnotationStampWithApBaseContentChecksum());
-  UnloadPage(page);
 }
 
 TEST_F(FPDFProgressiveRenderEmbedderTest, RenderAnnotWithPause) {
   // Test rendering of the page with annotations using progressive render APIs
   // with pause in rendering.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   FakePause pause(true);
-  bool render_done = StartRenderPageWithFlags(page, &pause, FPDF_ANNOT);
+  bool render_done = StartRenderPageWithFlags(page.get(), &pause, FPDF_ANNOT);
   EXPECT_FALSE(render_done);
 
   while (!render_done) {
-    render_done = ContinueRenderPage(page, &pause);
+    render_done = ContinueRenderPage(page.get(), &pause);
   }
-  ScopedFPDFBitmap bitmap = FinishRenderPage(page);
+  ScopedFPDFBitmap bitmap = FinishRenderPage(page.get());
   CompareBitmap(bitmap.get(), 595, 842,
                 pdfium::AnnotationStampWithApChecksum());
-  UnloadPage(page);
 }
 
 TEST_F(FPDFProgressiveRenderEmbedderTest, RenderFormsWithPause) {
   // Test rendering of the page with forms using progressive render APIs
   // with pause in rendering.
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   FakePause pause(true);
-  bool render_done = StartRenderPage(page, &pause);
+  bool render_done = StartRenderPage(page.get(), &pause);
   EXPECT_FALSE(render_done);
 
   while (!render_done) {
-    render_done = ContinueRenderPage(page, &pause);
+    render_done = ContinueRenderPage(page.get(), &pause);
   }
-  ScopedFPDFBitmap bitmap = FinishRenderPageWithForms(page, form_handle());
+  ScopedFPDFBitmap bitmap =
+      FinishRenderPageWithForms(page.get(), form_handle());
   CompareBitmap(bitmap.get(), 300, 300, pdfium::TextFormChecksum());
-  UnloadPage(page);
 }
 
 void FPDFProgressiveRenderEmbedderTest::VerifyRenderingWithColorScheme(
@@ -312,14 +309,13 @@
     const char* md5) {
   ASSERT_TRUE(document());
 
-  FPDF_PAGE page = LoadPage(page_num);
+  ScopedEmbedderTestPage page = LoadScopedPage(page_num);
   ASSERT_TRUE(page);
 
   ScopedFPDFBitmap bitmap = RenderPageWithForcedColorScheme(
-      page, form_handle(), flags, color_scheme, background_color);
+      page.get(), form_handle(), flags, color_scheme, background_color);
   ASSERT_TRUE(bitmap);
   CompareBitmap(bitmap.get(), bitmap_width, bitmap_height, md5);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFProgressiveRenderEmbedderTest, RenderTextWithColorScheme) {
diff --git a/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp b/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
index f3b6cae..68505e5 100644
--- a/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
+++ b/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
@@ -12,9 +12,8 @@
 TEST_F(FPDFRenderPatternEmbedderTest, LoadError_547706) {
   // Test shading where object is a dictionary instead of a stream.
   ASSERT_TRUE(OpenDocument("bug_547706.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 612, 792, pdfium::kBlankPage612By792Checksum);
-  UnloadPage(page);
 }
diff --git a/core/fxcodec/jbig2/jbig2_embeddertest.cpp b/core/fxcodec/jbig2/jbig2_embeddertest.cpp
index c017e48..80cbd6d 100644
--- a/core/fxcodec/jbig2/jbig2_embeddertest.cpp
+++ b/core/fxcodec/jbig2/jbig2_embeddertest.cpp
@@ -18,9 +18,8 @@
   // Test jbig2 image in PDF file can be loaded successfully.
   // Should not crash.
   ASSERT_TRUE(OpenDocument("bug_631912.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 691, 432, "726c2b8c89df0ab40627322d1dddd521");
-  UnloadPage(page);
 }
diff --git a/core/fxge/fx_ge_text_embeddertest.cpp b/core/fxge/fx_ge_text_embeddertest.cpp
index 9a79620..5276f98 100644
--- a/core/fxge/fx_ge_text_embeddertest.cpp
+++ b/core/fxge/fx_ge_text_embeddertest.cpp
@@ -23,10 +23,9 @@
 TEST_F(FXGETextEmbedderTest, BadItalic) {
   // Shouldn't crash.
   ASSERT_TRUE(OpenDocument("bug_601362.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   EXPECT_EQ(612, FPDFBitmap_GetWidth(bitmap.get()));
   EXPECT_EQ(792, FPDFBitmap_GetHeight(bitmap.get()));
-  UnloadPage(page);
 }
diff --git a/core/fxge/skia/fx_skia_device_embeddertest.cpp b/core/fxge/skia/fx_skia_device_embeddertest.cpp
index 6e54863..5440435 100644
--- a/core/fxge/skia/fx_skia_device_embeddertest.cpp
+++ b/core/fxge/skia/fx_skia_device_embeddertest.cpp
@@ -263,7 +263,7 @@
   }
 
   ASSERT_TRUE(OpenDocument("bug_2034.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   std::set<int> image_ids;
@@ -281,14 +281,12 @@
       }));
 
   // Render top half.
-  RenderPageToSkCanvas(page, /*start_x=*/0, /*start_y=*/0,
+  RenderPageToSkCanvas(page.get(), /*start_x=*/0, /*start_y=*/0,
                        /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, canvas);
 
   // Render bottom half.
-  RenderPageToSkCanvas(page, /*start_x=*/0, /*start_y=*/-kPageHeight / 2,
+  RenderPageToSkCanvas(page.get(), /*start_x=*/0, /*start_y=*/-kPageHeight / 2,
                        /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, canvas);
 
   EXPECT_THAT(image_ids, SizeIs(1));
-
-  UnloadPage(page);
 }
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp
index 21fd3c7..ead0815 100644
--- a/fpdfsdk/fpdf_annot_embeddertest.cpp
+++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -346,7 +346,7 @@
 
 TEST_F(FPDFAnnotEmbedderTest, BadParams) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   EXPECT_EQ(0, FPDFPage_GetAnnotCount(nullptr));
@@ -354,8 +354,8 @@
   EXPECT_FALSE(FPDFPage_GetAnnot(nullptr, 0));
   EXPECT_FALSE(FPDFPage_GetAnnot(nullptr, -1));
   EXPECT_FALSE(FPDFPage_GetAnnot(nullptr, 1));
-  EXPECT_FALSE(FPDFPage_GetAnnot(page, -1));
-  EXPECT_FALSE(FPDFPage_GetAnnot(page, 1));
+  EXPECT_FALSE(FPDFPage_GetAnnot(page.get(), -1));
+  EXPECT_FALSE(FPDFPage_GetAnnot(page.get(), 1));
 
   EXPECT_EQ(FPDF_ANNOT_UNKNOWN, FPDFAnnot_GetSubtype(nullptr));
 
@@ -376,35 +376,29 @@
   EXPECT_EQ(0u, FPDFAnnot_GetStringValue(nullptr, "foo", buffer, 0));
   EXPECT_EQ(0u,
             FPDFAnnot_GetStringValue(nullptr, "foo", buffer, sizeof(buffer)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, BadAnnotsEntry) {
   ASSERT_TRUE(OpenDocument("bad_annots_entry.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
-  EXPECT_FALSE(FPDFPage_GetAnnot(page, 0));
-
-  UnloadPage(page);
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
+  EXPECT_FALSE(FPDFPage_GetAnnot(page.get(), 0));
 }
 
 TEST_F(FPDFAnnotEmbedderTest, RenderAnnotWithOnlyRolloverAP) {
   // Open a file with one annotation and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_rollover_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // This annotation has a malformed appearance stream, which does not have its
   // normal appearance defined, only its rollover appearance. In this case, its
   // normal appearance should be generated, allowing the highlight annotation to
   // still display.
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 612, 792, "dc98f06da047bd8aabfa99562d2cbd1e");
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, RenderMultilineMarkupAnnotWithoutAP) {
@@ -417,13 +411,11 @@
 
   // Open a file with multiline markup annotations.
   ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 595, 842, checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, ExtractHighlightLongContent) {
@@ -572,36 +564,35 @@
 TEST_F(FPDFAnnotEmbedderTest, AddIllegalSubtypeAnnotation) {
   // Open a file with one annotation and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Add an annotation with an illegal subtype.
-  ASSERT_FALSE(FPDFPage_CreateAnnot(page, -1));
-
-  UnloadPage(page);
+  ASSERT_FALSE(FPDFPage_CreateAnnot(page.get(), -1));
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AddFirstTextAnnotation) {
   // Open a file with no annotation and load its first page.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get()));
 
   {
     // Add a text annotation to the page.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_TEXT));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT));
     ASSERT_TRUE(annot);
 
     // Check that there is now 1 annotations on this page.
-    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
     // Check that the subtype of the annotation is correct.
     EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get()));
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get()));
 
@@ -663,26 +654,26 @@
                                             buf.data(), length_bytes));
     EXPECT_EQ(kContents, GetPlatformWString(buf.data()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AddAndSaveLinkAnnotation) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 200, 200, pdfium::HelloWorldChecksum());
   }
-  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get()));
 
   constexpr char kUri[] = "https://pdfium.org/";
 
   {
     // Add a link annotation to the page and set its URI.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_LINK));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_LINK));
     ASSERT_TRUE(annot);
-    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
     EXPECT_EQ(FPDF_ANNOT_LINK, FPDFAnnot_GetSubtype(annot.get()));
     EXPECT_TRUE(FPDFAnnot_SetURI(annot.get(), kUri));
     VerifyUriActionInLink(document(), FPDFAnnot_GetLink(annot.get()), kUri);
@@ -702,60 +693,59 @@
                                     /*vertical_radius=*/0.0f,
                                     /*border_width=*/0.0f));
 
-    VerifyUriActionInLink(document(), FPDFLink_GetLinkAtPoint(page, 40.0, 50.0),
-                          kUri);
+    VerifyUriActionInLink(
+        document(), FPDFLink_GetLinkAtPoint(page.get(), 40.0, 50.0), kUri);
   }
 
   {
     // Add an ink annotation to the page. Trying to add a link to it fails.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_INK));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_INK));
     ASSERT_TRUE(annot);
-    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
     EXPECT_EQ(FPDF_ANNOT_INK, FPDFAnnot_GetSubtype(annot.get()));
     EXPECT_FALSE(FPDFAnnot_SetURI(annot.get(), kUri));
   }
 
   // Remove the ink annotation added above for negative testing.
-  EXPECT_TRUE(FPDFPage_RemoveAnnot(page, 1));
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_TRUE(FPDFPage_RemoveAnnot(page.get(), 1));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
-  // Save the document, closing the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Reopen the document and make sure it still renders the same. Since the link
   // does not have a border, it does not affect the rendering.
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(0);
-  ASSERT_TRUE(page);
-  VerifySavedRendering(page, 200, 200, pdfium::HelloWorldChecksum());
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  FPDF_PAGE saved_page = LoadSavedPage(0);
+  ASSERT_TRUE(saved_page);
+  VerifySavedRendering(saved_page, 200, 200, pdfium::HelloWorldChecksum());
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(saved_page));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_LINK, FPDFAnnot_GetSubtype(annot.get()));
     VerifyUriActionInLink(document(), FPDFAnnot_GetLink(annot.get()), kUri);
-    VerifyUriActionInLink(document(), FPDFLink_GetLinkAtPoint(page, 40.0, 50.0),
-                          kUri);
+    VerifyUriActionInLink(
+        document(), FPDFLink_GetLinkAtPoint(saved_page, 40.0, 50.0), kUri);
   }
 
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AddAndSaveUnderlineAnnotation) {
   // Open a file with one annotation and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Check that there is a total of one annotation on its first page, and verify
   // its quadpoints.
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
   FS_QUADPOINTSF quadpoints;
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     ASSERT_TRUE(FPDFAnnot_GetAttachmentPoints(annot.get(), 0, &quadpoints));
     EXPECT_EQ(115.802643f, quadpoints.x1);
@@ -767,16 +757,14 @@
   // Add an underline annotation to the page and set its quadpoints.
   {
     ScopedFPDFAnnotation annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_UNDERLINE));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_UNDERLINE));
     ASSERT_TRUE(annot);
     quadpoints.x1 = 140.802643f;
     quadpoints.x3 = 140.802643f;
     ASSERT_TRUE(FPDFAnnot_AppendAttachmentPoints(annot.get(), &quadpoints));
   }
 
-  // Save the document and close the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Open the saved document.
   const char* checksum = []() {
@@ -793,17 +781,17 @@
   }();
 
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(0);
-  ASSERT_TRUE(page);
-  VerifySavedRendering(page, 612, 792, checksum);
+  FPDF_PAGE saved_page = LoadSavedPage(0);
+  ASSERT_TRUE(saved_page);
+  VerifySavedRendering(saved_page, 612, 792, checksum);
 
   // Check that the saved document has 2 annotations on the first page
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(saved_page));
 
   {
     // Check that the second annotation is an underline annotation and verify
     // its quadpoints.
-    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(saved_page, 1));
     ASSERT_TRUE(new_annot);
     EXPECT_EQ(FPDF_ANNOT_UNDERLINE, FPDFAnnot_GetSubtype(new_annot.get()));
     FS_QUADPOINTSF new_quadpoints;
@@ -815,19 +803,19 @@
     EXPECT_NEAR(quadpoints.y4, new_quadpoints.y4, 0.001f);
   }
 
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetAndSetQuadPoints) {
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_square_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(4, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(4, FPDFPage_GetAnnotCount(page.get()));
 
   // Retrieve the highlight annotation.
-  FPDF_ANNOTATION annot = FPDFPage_GetAnnot(page, 0);
+  FPDF_ANNOTATION annot = FPDFPage_GetAnnot(page.get(), 0);
   ASSERT_TRUE(annot);
   ASSERT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot));
 
@@ -889,7 +877,7 @@
   FPDFPage_CloseAnnot(annot);
 
   // Retrieve the square annotation
-  FPDF_ANNOTATION squareAnnot = FPDFPage_GetAnnot(page, 2);
+  FPDF_ANNOTATION squareAnnot = FPDFPage_GetAnnot(page.get(), 2);
 
   {
     // Check that attempting to set its quadpoints would fail
@@ -900,7 +888,6 @@
   }
 
   FPDFPage_CloseAnnot(squareAnnot);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, ModifyRectQuadpointsWithAP) {
@@ -955,13 +942,13 @@
 
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_square_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(4, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(4, FPDFPage_GetAnnotCount(page.get()));
 
   // Check that the original file renders correctly.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_original);
   }
 
@@ -970,7 +957,7 @@
 
   // Retrieve the highlight annotation which has its AP stream already defined.
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot.get()));
 
@@ -1001,7 +988,8 @@
 
     // Check that updating quadpoints does not change the annotation's position.
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 612, 792, md5_original);
     }
 
@@ -1022,13 +1010,13 @@
 
   // Check that updating the rectangle changes the annotation's position.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_modified_highlight);
   }
 
   {
     // Retrieve the square annotation which has its AP stream already defined.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_SQUARE, FPDFAnnot_GetSubtype(annot.get()));
 
@@ -1042,26 +1030,23 @@
 
     // Check that updating the rectangle changes the square annotation's
     // position.
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_modified_square);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, CountAttachmentPoints) {
   // Open a file with multiline markup annotations.
   ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // This is a three line annotation.
     EXPECT_EQ(3u, FPDFAnnot_CountAttachmentPoints(annot.get()));
   }
-  UnloadPage(page);
 
   // null annotation should return 0
   EXPECT_EQ(0u, FPDFAnnot_CountAttachmentPoints(nullptr));
@@ -1193,24 +1178,24 @@
 
   // Open a file with two annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   // Check that the page renders correctly.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, AnnotationStampWithApChecksum());
   }
 
   {
     // Retrieve the stamp annotation which has its AP stream already defined.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that this annotation has one path object and retrieve it.
     EXPECT_EQ(1, FPDFAnnot_GetObjectCount(annot.get()));
-    ASSERT_EQ(32, FPDFPage_CountObjects(page));
+    ASSERT_EQ(32, FPDFPage_CountObjects(page.get()));
     FPDF_PAGEOBJECT path = FPDFAnnot_GetObject(annot.get(), 1);
     EXPECT_FALSE(path);
     path = FPDFAnnot_GetObject(annot.get(), 0);
@@ -1223,7 +1208,8 @@
 
     // Check that the page with the modified annotation renders correctly.
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 595, 842, md5_modified_path);
     }
 
@@ -1238,23 +1224,24 @@
 
     // The object is in the annontation, not in the page, so the page object
     // array should not change.
-    ASSERT_EQ(32, FPDFPage_CountObjects(page));
+    ASSERT_EQ(32, FPDFPage_CountObjects(page.get()));
 
     // Check that the page with an annotation with two paths renders correctly.
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 595, 842, md5_two_paths);
     }
 
     // Delete the newly added path object.
     EXPECT_TRUE(FPDFAnnot_RemoveObject(annot.get(), 1));
     EXPECT_EQ(1, FPDFAnnot_GetObjectCount(annot.get()));
-    ASSERT_EQ(32, FPDFPage_CountObjects(page));
+    ASSERT_EQ(32, FPDFPage_CountObjects(page.get()));
   }
 
   // Check that the page renders the same as before.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, md5_modified_path);
   }
 
@@ -1262,7 +1249,8 @@
 
   {
     // Create another stamp annotation and set its annotation rectangle.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_STAMP));
     ASSERT_TRUE(annot);
     rect.left = 200.f;
     rect.bottom = 400.f;
@@ -1291,21 +1279,19 @@
     EXPECT_EQ(rect.top, new_rect.top);
   }
 
-  // Save the document and close the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Open the saved document.
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(0);
-  ASSERT_TRUE(page);
-  VerifySavedRendering(page, 595, 842, md5_new_annot);
+  FPDF_PAGE saved_page = LoadSavedPage(0);
+  ASSERT_TRUE(saved_page);
+  VerifySavedRendering(saved_page, 595, 842, md5_new_annot);
 
   // Check that the document has a correct count of annotations and objects.
-  EXPECT_EQ(3, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(3, FPDFPage_GetAnnotCount(saved_page));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 2));
     ASSERT_TRUE(annot);
     EXPECT_EQ(1, FPDFAnnot_GetObjectCount(annot.get()));
 
@@ -1318,25 +1304,25 @@
     EXPECT_EQ(rect.top, new_rect.top);
   }
 
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, ModifyAnnotationFlags) {
   // Open a file with an annotation and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_rollover_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Check that the page renders correctly.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, "dc98f06da047bd8aabfa99562d2cbd1e");
   }
 
   {
     // Retrieve the annotation.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that the original flag values are as expected.
@@ -1360,7 +1346,8 @@
 
     // Check that the page renders correctly without rendering the annotation.
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 612, 792, pdfium::kBlankPage612By792Checksum);
     }
 
@@ -1375,12 +1362,11 @@
 
     // Check that the page renders correctly as before.
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 612, 792, "dc98f06da047bd8aabfa99562d2cbd1e");
     }
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AddAndModifyImage) {
@@ -1419,13 +1405,13 @@
 
   // Open a file with two annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   // Check that the page renders correctly.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, AnnotationStampWithApChecksum());
   }
 
@@ -1434,7 +1420,9 @@
 
   {
     // Create a stamp annotation and set its annotation rectangle.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_STAMP));
+    FPDF_PAGE page0 = page.get();
     ASSERT_TRUE(annot);
     FS_RECTF rect;
     rect.left = 200.f;
@@ -1450,7 +1438,7 @@
     EXPECT_EQ(kBitmapSize, FPDFBitmap_GetWidth(image_bitmap));
     EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(image_bitmap));
     FPDF_PAGEOBJECT image_object = FPDFPageObj_NewImageObj(document());
-    ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, image_object, image_bitmap));
+    ASSERT_TRUE(FPDFImageObj_SetBitmap(&page0, 0, image_object, image_bitmap));
     static constexpr FS_MATRIX kBitmapScaleMatrix{kBitmapSize, 0, 0,
                                                   kBitmapSize, 0, 0};
     ASSERT_TRUE(FPDFPageObj_SetMatrix(image_object, &kBitmapScaleMatrix));
@@ -1460,13 +1448,13 @@
 
   // Check that the page renders correctly with the new image object.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, md5_new_image);
   }
 
   {
     // Retrieve the newly added stamp annotation and its image object.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
     EXPECT_EQ(1, FPDFAnnot_GetObjectCount(annot.get()));
     FPDF_PAGEOBJECT image_object = FPDFAnnot_GetObject(annot.get(), 0);
@@ -1475,13 +1463,14 @@
     // Modify the image in the new annotation.
     ASSERT_TRUE(FPDFBitmap_FillRect(image_bitmap, 0, 0, kBitmapSize,
                                     kBitmapSize, 0xff000000));
-    ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, image_object, image_bitmap));
+    FPDF_PAGE page_ptr = page.get();
+    ASSERT_TRUE(
+        FPDFImageObj_SetBitmap(&page_ptr, 0, image_object, image_bitmap));
     EXPECT_TRUE(FPDFAnnot_UpdateObject(annot.get(), image_object));
   }
 
   // Save the document and close the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
   FPDFBitmap_Destroy(image_bitmap);
 
   // Test that the saved document renders the modified image object correctly.
@@ -1528,19 +1517,20 @@
 
   // Open a file with two annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   // Check that the page renders correctly.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, AnnotationStampWithApChecksum());
   }
 
   {
     // Create a stamp annotation and set its annotation rectangle.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_STAMP));
     ASSERT_TRUE(annot);
     FS_RECTF rect;
     rect.left = 200.f;
@@ -1563,13 +1553,13 @@
 
   // Check that the page renders correctly with the new text object.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, md5_new_text);
   }
 
   {
     // Retrieve the newly added stamp annotation and its text object.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
     EXPECT_EQ(1, FPDFAnnot_GetObjectCount(annot.get()));
     FPDF_PAGEOBJECT text_object = FPDFAnnot_GetObject(annot.get(), 0);
@@ -1583,31 +1573,29 @@
 
   // Check that the page renders correctly with the modified text object.
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, md5_modified_text);
   }
 
   // Remove the new annotation, and check that the page renders as before.
-  EXPECT_TRUE(FPDFPage_RemoveAnnot(page, 2));
+  EXPECT_TRUE(FPDFPage_RemoveAnnot(page.get(), 2));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 595, 842, AnnotationStampWithApChecksum());
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetSetStringValue) {
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   static const wchar_t kNewDate[] = L"D:201706282359Z00'00'";
 
   {
     // Retrieve the first annotation.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that a non-existent key does not exist.
@@ -1650,7 +1638,6 @@
 
   // Save the document and close the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   const char* md5 = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -1671,11 +1658,11 @@
 
   // Open the saved annotation.
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(0);
-  ASSERT_TRUE(page);
-  VerifySavedRendering(page, 595, 842, md5);
+  FPDF_PAGE saved_page = LoadSavedPage(0);
+  ASSERT_TRUE(saved_page);
+  VerifySavedRendering(saved_page, 595, 842, md5);
   {
-    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(saved_page, 0));
 
     // Check that the string value of the modified date is the newly-set
     // value.
@@ -1691,19 +1678,19 @@
     EXPECT_EQ(kNewDate, GetPlatformWString(buf.data()));
   }
 
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetNumberValue) {
   // Open a file with four text annotations and load its first page.
   ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   {
     // First two annotations do not have "MaxLen" attribute.
     for (int i = 0; i < 2; i++) {
-      ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, i));
+      ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), i));
       ASSERT_TRUE(annot);
 
       // Verify that no "MaxLen" key present.
@@ -1714,7 +1701,7 @@
     }
 
     // Annotation in index 2 has "MaxLen" of 10.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
 
     // Verify that "MaxLen" key present.
@@ -1731,14 +1718,12 @@
     // Ask for key that exists but is not a number.
     EXPECT_FALSE(FPDFAnnot_GetNumberValue(annot.get(), "V", &value));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetSetAP) {
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -1746,7 +1731,7 @@
     static constexpr size_t kExpectNormalAPLength = 73970;
 
     // Retrieve the first annotation.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that the string value of an AP returns the expected length.
@@ -1826,13 +1811,12 @@
 
   // Save the modified document, then reopen it.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(0);
+  FPDF_PAGE saved_page = LoadSavedPage(0);
   ASSERT_TRUE(page);
   {
-    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation new_annot(FPDFPage_GetAnnot(saved_page, 0));
 
     // Check that the new annotation value is equal to the value we set before
     // saving.
@@ -1848,19 +1832,19 @@
   }
 
   // Close saved document.
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, RemoveOptionalAP) {
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve the first annotation.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Set Down AP. Normal AP is already set.
@@ -1883,19 +1867,17 @@
     EXPECT_EQ(2u, FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_DOWN,
                                   nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, RemoveRequiredAP) {
   // Open a file with four annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve the first annotation.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Set Down AP. Normal AP is already set.
@@ -1916,23 +1898,21 @@
     EXPECT_EQ(2u, FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_DOWN,
                                   nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, ExtractLinkedAnnotations) {
   // Open a file with annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_square_with_ap.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(-1, FPDFPage_GetAnnotIndex(page, nullptr));
+  EXPECT_EQ(-1, FPDFPage_GetAnnotIndex(page.get(), nullptr));
 
   {
     // Retrieve the highlight annotation which has its popup defined.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot.get()));
-    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, annot.get()));
+    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page.get(), annot.get()));
     static const char kPopupKey[] = "Popup";
     ASSERT_TRUE(FPDFAnnot_HasKey(annot.get(), kPopupKey));
     ASSERT_EQ(FPDF_OBJECT_REFERENCE,
@@ -1943,7 +1923,7 @@
         FPDFAnnot_GetLinkedAnnot(annot.get(), kPopupKey));
     ASSERT_TRUE(popup);
     EXPECT_EQ(FPDF_ANNOT_POPUP, FPDFAnnot_GetSubtype(popup.get()));
-    EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page, popup.get()));
+    EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page.get(), popup.get()));
     FS_RECTF rect;
     ASSERT_TRUE(FPDFAnnot_GetRect(popup.get(), &rect));
     EXPECT_NEAR(612.0f, rect.left, 0.001f);
@@ -1962,19 +1942,17 @@
               FPDFAnnot_GetValueType(annot.get(), pdfium::annotation::kP));
     EXPECT_FALSE(FPDFAnnot_GetLinkedAnnot(annot.get(), pdfium::annotation::kP));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldFlagsTextField) {
   // Open file with form text fields.
   ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve the first annotation: user-editable text field.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -1988,7 +1966,7 @@
 
   {
     // Retrieve the second annotation: read-only text field.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -2002,7 +1980,7 @@
 
   {
     // Retrieve the fourth annotation: user-editable password text field.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 3));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -2013,19 +1991,17 @@
     EXPECT_FALSE(flags & FPDF_FORMFLAG_TEXT_MULTILINE);
     EXPECT_TRUE(flags & FPDF_FORMFLAG_TEXT_PASSWORD);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldFlagsComboBox) {
   // Open file with form text fields.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve the first annotation: user-editable combobox.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -2040,7 +2016,7 @@
 
   {
     // Retrieve the second annotation: regular combobox.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -2055,7 +2031,7 @@
 
   {
     // Retrieve the third annotation: read-only combobox.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
 
     // Check that the flag values are as expected.
@@ -2067,49 +2043,46 @@
     EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT);
     EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_MULTI_SELECT);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormAnnotNull) {
   // Open file with form text fields.
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Attempt to get an annotation where no annotation exists on page.
   static const FS_POINTF kOriginPoint = {0.0f, 0.0f};
   EXPECT_FALSE(
-      FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kOriginPoint));
+      FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kOriginPoint));
 
   static const FS_POINTF kValidPoint = {120.0f, 120.0f};
   {
     // Verify there is an annotation.
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kValidPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kValidPoint));
     EXPECT_TRUE(annot);
   }
 
   // Try other bad inputs at a valid location.
   EXPECT_FALSE(FPDFAnnot_GetFormFieldAtPoint(nullptr, nullptr, &kValidPoint));
-  EXPECT_FALSE(FPDFAnnot_GetFormFieldAtPoint(nullptr, page, &kValidPoint));
+  EXPECT_FALSE(
+      FPDFAnnot_GetFormFieldAtPoint(nullptr, page.get(), &kValidPoint));
   EXPECT_FALSE(
       FPDFAnnot_GetFormFieldAtPoint(form_handle(), nullptr, &kValidPoint));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormAnnotAndCheckFlagsTextField) {
   // Open file with form text fields.
   ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve user-editable text field annotation.
     static const FS_POINTF kPoint = {105.0f, 118.0f};
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kPoint));
     ASSERT_TRUE(annot);
 
     // Check that interactive form annotation flag values are as expected.
@@ -2123,7 +2096,7 @@
     // Retrieve read-only text field annotation.
     static const FS_POINTF kPoint = {105.0f, 202.0f};
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kPoint));
     ASSERT_TRUE(annot);
 
     // Check that interactive form annotation flag values are as expected.
@@ -2132,21 +2105,19 @@
     EXPECT_FALSE(flags & FPDF_FORMFLAG_REQUIRED);
     EXPECT_FALSE(flags & FPDF_FORMFLAG_NOEXPORT);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormAnnotAndCheckFlagsComboBox) {
   // Open file with form comboboxes.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Retrieve user-editable combobox annotation.
     static const FS_POINTF kPoint = {102.0f, 363.0f};
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kPoint));
     ASSERT_TRUE(annot);
 
     // Check that interactive form annotation flag values are as expected.
@@ -2163,7 +2134,7 @@
     // Retrieve regular combobox annotation.
     static const FS_POINTF kPoint = {102.0f, 413.0f};
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kPoint));
     ASSERT_TRUE(annot);
 
     // Check that interactive form annotation flag values are as expected.
@@ -2180,7 +2151,7 @@
     // Retrieve read-only combobox annotation.
     static const FS_POINTF kPoint = {102.0f, 513.0f};
     ScopedFPDFAnnotation annot(
-        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page, &kPoint));
+        FPDFAnnot_GetFormFieldAtPoint(form_handle(), page.get(), &kPoint));
     ASSERT_TRUE(annot);
 
     // Check that interactive form annotation flag values are as expected.
@@ -2192,8 +2163,6 @@
     EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT);
     EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_MULTI_SELECT);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, Bug1206) {
@@ -2207,7 +2176,7 @@
 
   ASSERT_TRUE(OpenDocument("bug_1206.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
@@ -2216,7 +2185,7 @@
   ClearString();
 
   for (size_t i = 0; i < 10; ++i) {
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, expected_bitmap);
 
     ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
@@ -2225,15 +2194,13 @@
     EXPECT_GT(GetString().size(), original_size);
     ClearString();
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, Bug1212) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get()));
 
   static const char kTestKey[] = "test";
   static const wchar_t kData[] = L"\xf6\xe4";
@@ -2242,9 +2209,10 @@
 
   {
     // Add a text annotation to the page.
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_TEXT));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT));
     ASSERT_TRUE(annot);
-    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
     EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get()));
 
     // Make sure there is no test key, add set a value there, and read it back.
@@ -2263,11 +2231,12 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP));
+    ScopedFPDFAnnotation annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_STAMP));
     ASSERT_TRUE(annot);
     const FS_RECTF bounding_rect{206.0f, 753.0f, 339.0f, 709.0f};
     EXPECT_TRUE(FPDFAnnot_SetRect(annot.get(), &bounding_rect));
-    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
     EXPECT_EQ(FPDF_ANNOT_STAMP, FPDFAnnot_GetSubtype(annot.get()));
     // Also do the same test for its appearance string.
     std::fill(buf.begin(), buf.end(), 'x');
@@ -2287,7 +2256,6 @@
     EXPECT_EQ(kData, GetPlatformWString(buf.data()));
   }
 
-  UnloadPage(page);
 
   {
     // Save a copy, open the copy, and check the annotation again.
@@ -2329,16 +2297,16 @@
 TEST_F(FPDFAnnotEmbedderTest, GetOptionCountCombobox) {
   // Open a file with combobox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(3, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(26, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
@@ -2348,61 +2316,55 @@
     EXPECT_EQ(-1, FPDFAnnot_GetOptionCount(form_handle(), nullptr));
     EXPECT_EQ(-1, FPDFAnnot_GetOptionCount(nullptr, annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetOptionCountListbox) {
   // Open a file with listbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("listbox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(3, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(26, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetOptionCountInvalidAnnotations) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // annotations do not have "Opt" array and will return -1
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(-1, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(-1, FPDFAnnot_GetOptionCount(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetOptionLabelCombobox) {
   // Open a file with combobox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     int index = 0;
@@ -2414,7 +2376,7 @@
                                            buf.data(), length_bytes));
     EXPECT_EQ(L"Foo", GetPlatformWString(buf.data()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     index = 0;
@@ -2447,18 +2409,16 @@
     EXPECT_EQ(0u,
               FPDFAnnot_GetOptionLabel(form_handle(), nullptr, 0, nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetOptionLabelListbox) {
   // Open a file with listbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("listbox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     int index = 0;
@@ -2470,7 +2430,7 @@
                                            buf.data(), length_bytes));
     EXPECT_EQ(L"Foo", GetPlatformWString(buf.data()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     index = 0;
@@ -2497,42 +2457,38 @@
     EXPECT_EQ(0u, FPDFAnnot_GetOptionLabel(form_handle(), annot.get(), 26,
                                            nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetOptionLabelInvalidAnnotations) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // annotations do not have "Opt" array and will return 0
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(0u, FPDFAnnot_GetOptionLabel(form_handle(), annot.get(), 0,
                                            nullptr, 0));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(0u, FPDFAnnot_GetOptionLabel(form_handle(), annot.get(), 0,
                                            nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsOptionSelectedCombobox) {
   // Open a file with combobox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Checks for Combobox with no Values (/V) or Selected Indices (/I) objects.
@@ -2542,7 +2498,7 @@
       EXPECT_FALSE(FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Checks for Combobox with Values (/V) object which is just a string.
@@ -2566,18 +2522,16 @@
         FPDFAnnot_IsOptionSelected(form_handle(), nullptr, /*index=*/0));
     EXPECT_FALSE(FPDFAnnot_IsOptionSelected(nullptr, annot.get(), /*index=*/0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsOptionSelectedListbox) {
   // Open a file with listbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("listbox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Checks for Listbox with no Values (/V) or Selected Indices (/I) objects.
@@ -2587,7 +2541,7 @@
       EXPECT_FALSE(FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Checks for Listbox with Values (/V) object which is just a string.
@@ -2598,7 +2552,7 @@
                 FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
 
-    annot.reset(FPDFPage_GetAnnot(page, 3));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
 
     // Checks for Listbox with only Selected indices (/I) object which is an
@@ -2611,7 +2565,7 @@
                 FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
 
-    annot.reset(FPDFPage_GetAnnot(page, 4));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 4));
     ASSERT_TRUE(annot);
 
     // Checks for Listbox with Values (/V) object which is an array with
@@ -2624,7 +2578,7 @@
                 FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
 
-    annot.reset(FPDFPage_GetAnnot(page, 5));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 5));
     ASSERT_TRUE(annot);
 
     // Checks for Listbox with both Values (/V) and Selected Indices (/I)
@@ -2637,58 +2591,54 @@
                 FPDFAnnot_IsOptionSelected(form_handle(), annot.get(), i));
     }
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsOptionSelectedInvalidAnnotations) {
   // Open a file with multiple form field annotations and load its first page.
   ASSERT_TRUE(OpenDocument("multiple_form_types.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Checks for link annotation.
     EXPECT_FALSE(FPDFAnnot_IsOptionSelected(form_handle(), annot.get(),
                                             /*index=*/0));
 
-    annot.reset(FPDFPage_GetAnnot(page, 3));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
 
     // Checks for text field annotation.
     EXPECT_FALSE(FPDFAnnot_IsOptionSelected(form_handle(), annot.get(),
                                             /*index=*/0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontSizeCombobox) {
   // Open a file with combobox annotations and load its first page.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // All 3 widgets have Tf font size 12.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     float value;
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value));
     EXPECT_EQ(12.0, value);
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     float value_two;
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value_two));
     EXPECT_EQ(12.0, value_two);
 
-    annot.reset(FPDFPage_GetAnnot(page, 2));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
 
     float value_three;
@@ -2696,33 +2646,31 @@
         FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value_three));
     EXPECT_EQ(12.0, value_three);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontSizeTextField) {
   // Open a file with textfield annotations and load its first page.
   ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // All 4 widgets have Tf font size 12.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     float value;
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value));
     EXPECT_EQ(12.0, value);
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     float value_two;
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value_two));
     EXPECT_EQ(12.0, value_two);
 
-    annot.reset(FPDFPage_GetAnnot(page, 2));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
 
     float value_three;
@@ -2734,41 +2682,37 @@
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value_four));
     EXPECT_EQ(12.0, value_four);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontSizeInvalidAnnotationTypes) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Annotations that do not have variable text and will return -1.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     float value;
     ASSERT_FALSE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value));
 
-    annot.reset(FPDFPage_GetAnnot(page, 1));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     ASSERT_FALSE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontSizeInvalidArguments) {
   // Open a file with combobox annotations and load its first page.
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Check bad form handle / annot.
@@ -2777,38 +2721,34 @@
     ASSERT_FALSE(FPDFAnnot_GetFontSize(form_handle(), nullptr, &value));
     ASSERT_FALSE(FPDFAnnot_GetFontSize(nullptr, nullptr, &value));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontSizeNegative) {
   // Open a file with textfield annotations and load its first page.
   ASSERT_TRUE(OpenDocument("text_form_negative_fontsize.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Obtain the first annotation, a text field with negative font size, -12.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     float value;
     ASSERT_TRUE(FPDFAnnot_GetFontSize(form_handle(), annot.get(), &value));
     EXPECT_EQ(-12.0, value);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFontColor) {
   // Open a file with textfield annotations and load its first page.
   ASSERT_TRUE(OpenDocument("text_form_color.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Obtain the first annotation, a text field with orange color.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // Negative testing.
@@ -2833,128 +2773,114 @@
     EXPECT_EQ(0x80U, G);
     EXPECT_EQ(0x00U, B);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedCheckbox) {
   // Open a file with checkbox and radiobuttons widget annotations and load its
   // first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedCheckboxReadOnly) {
   // Open a file with checkbox and radiobutton widget annotations and load its
   // first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     ASSERT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedRadioButton) {
   // Open a file with checkbox and radiobutton widget annotations and load its
   // first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 5));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 5));
     ASSERT_TRUE(annot);
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 6));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 6));
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 7));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 7));
     ASSERT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedRadioButtonReadOnly) {
   // Open a file with checkbox and radiobutton widget annotations and load its
   // first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 3));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
 
-    annot.reset(FPDFPage_GetAnnot(page, 4));
+    annot.reset(FPDFPage_GetAnnot(page.get(), 4));
     ASSERT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedInvalidArguments) {
   // Open a file with checkbox and radiobuttons widget annotations and load its
   // first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     ASSERT_FALSE(FPDFAnnot_IsChecked(nullptr, annot.get()));
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), nullptr));
     ASSERT_FALSE(FPDFAnnot_IsChecked(nullptr, nullptr));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, IsCheckedInvalidWidgetType) {
   // Open a file with text widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     ASSERT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldType) {
   ASSERT_TRUE(OpenDocument("multiple_form_types.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   EXPECT_EQ(-1, FPDFAnnot_GetFormFieldType(form_handle(), nullptr));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
     EXPECT_EQ(-1, FPDFAnnot_GetFormFieldType(nullptr, annot.get()));
   }
@@ -2969,24 +2895,23 @@
                 {4, FPDF_FORMFIELD_CHECKBOX},
                 {5, FPDF_FORMFIELD_RADIOBUTTON}};
   for (const auto& test : kTests) {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, test.input));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), test.input));
     ASSERT_TRUE(annot);
     EXPECT_EQ(test.output,
               FPDFAnnot_GetFormFieldType(form_handle(), annot.get()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldValueTextField) {
   ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     EXPECT_EQ(0u,
               FPDFAnnot_GetFormFieldValue(form_handle(), nullptr, nullptr, 0));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(0u,
@@ -3001,7 +2926,7 @@
     EXPECT_EQ(L"", GetPlatformWString(buf.data()));
   }
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
 
     unsigned long length_bytes =
@@ -3012,16 +2937,15 @@
                                                buf.data(), length_bytes));
     EXPECT_EQ(L"Elephant", GetPlatformWString(buf.data()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldValueComboBox) {
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     unsigned long length_bytes =
@@ -3033,7 +2957,7 @@
     EXPECT_EQ(L"", GetPlatformWString(buf.data()));
   }
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     unsigned long length_bytes =
@@ -3044,19 +2968,18 @@
                                                buf.data(), length_bytes));
     EXPECT_EQ(L"Banana", GetPlatformWString(buf.data()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldNameTextField) {
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     EXPECT_EQ(0u,
               FPDFAnnot_GetFormFieldName(form_handle(), nullptr, nullptr, 0));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     EXPECT_EQ(0u, FPDFAnnot_GetFormFieldName(nullptr, annot.get(), nullptr, 0));
@@ -3069,16 +2992,15 @@
                                               buf.data(), length_bytes));
     EXPECT_EQ(L"Text Box", GetPlatformWString(buf.data()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldNameComboBox) {
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     unsigned long length_bytes =
@@ -3089,12 +3011,11 @@
                                               buf.data(), length_bytes));
     EXPECT_EQ(L"Combo_Editable", GetPlatformWString(buf.data()));
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, FocusableAnnotSubtypes) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Verify widgets are by default focusable.
@@ -3110,7 +3031,7 @@
 
   const FPDF_ANNOTATION_SUBTYPE kExpectedDefaultFocusableSubtypes[] = {
       FPDF_ANNOT_WIDGET};
-  VerifyAnnotationSubtypesAndFocusability(form_handle(), page,
+  VerifyAnnotationSubtypesAndFocusability(form_handle(), page.get(),
                                           kExpectedAnnotSubtypes,
                                           kExpectedDefaultFocusableSubtypes);
 
@@ -3125,7 +3046,7 @@
       FPDFAnnot_SetFocusableSubtypes(form_handle(), kDefaultSubtypes, 0));
   ASSERT_EQ(0, FPDFAnnot_GetFocusableSubtypesCount(form_handle()));
 
-  VerifyAnnotationSubtypesAndFocusability(form_handle(), page,
+  VerifyAnnotationSubtypesAndFocusability(form_handle(), page.get(),
                                           kExpectedAnnotSubtypes, {});
 
   // Now make links focusable.
@@ -3134,7 +3055,7 @@
 
   const FPDF_ANNOTATION_SUBTYPE kExpectedLinkocusableSubtypes[] = {
       FPDF_ANNOT_LINK};
-  VerifyAnnotationSubtypesAndFocusability(form_handle(), page,
+  VerifyAnnotationSubtypesAndFocusability(form_handle(), page.get(),
                                           kExpectedAnnotSubtypes,
                                           kExpectedLinkocusableSubtypes);
 
@@ -3152,13 +3073,11 @@
       FPDFAnnot_GetFocusableSubtypes(form_handle(), nullptr, subtypes.size()));
   EXPECT_FALSE(
       FPDFAnnot_GetFocusableSubtypes(form_handle(), subtypes.data(), 0));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, FocusableAnnotRendering) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -3179,7 +3098,7 @@
 #endif
     }();
     // Check the initial rendering.
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_sum);
   }
 
@@ -3214,11 +3133,11 @@
 #endif
     }();
     // Focus the first link and check the rendering.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_LINK, FPDFAnnot_GetSubtype(annot.get()));
     EXPECT_TRUE(FORM_SetFocusedAnnot(form_handle(), annot.get()));
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_sum);
   }
 
@@ -3240,27 +3159,25 @@
 #endif
     }();
     // Focus the first highlight and check the rendering.
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 4));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 4));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot.get()));
     EXPECT_TRUE(FORM_SetFocusedAnnot(form_handle(), annot.get()));
-    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+    ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(bitmap.get(), 612, 792, md5_sum);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetLinkFromAnnotation) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   {
     constexpr char kExpectedResult[] =
         "https://cs.chromium.org/chromium/src/third_party/pdfium/public/"
         "fpdf_text.h";
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 3));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_LINK, FPDFAnnot_GetSubtype(annot.get()));
     VerifyUriActionInLink(document(), FPDFAnnot_GetLink(annot.get()),
@@ -3268,21 +3185,19 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 4));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 4));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot.get()));
     EXPECT_FALSE(FPDFAnnot_GetLink(annot.get()));
   }
 
   EXPECT_FALSE(FPDFAnnot_GetLink(nullptr));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlCountRadioButton) {
   // Open a file with radio button widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -3290,7 +3205,7 @@
     EXPECT_EQ(-1,
               FPDFAnnot_GetFormControlCount(form_handle(), /*annot=*/nullptr));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 3));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
 
     // Checks for bad form handle.
@@ -3299,44 +3214,38 @@
 
     EXPECT_EQ(3, FPDFAnnot_GetFormControlCount(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlCountCheckBox) {
   // Open a file with checkbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(1, FPDFAnnot_GetFormControlCount(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlCountInvalidAnnotation) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(-1, FPDFAnnot_GetFormControlCount(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlIndexRadioButton) {
   // Open a file with radio button widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -3344,7 +3253,7 @@
     EXPECT_EQ(-1,
               FPDFAnnot_GetFormControlIndex(form_handle(), /*annot=*/nullptr));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 3));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 3));
     ASSERT_TRUE(annot);
 
     // Checks for bad form handle.
@@ -3353,44 +3262,38 @@
 
     EXPECT_EQ(1, FPDFAnnot_GetFormControlIndex(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlIndexCheckBox) {
   // Open a file with checkbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(0, FPDFAnnot_GetFormControlIndex(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormControlIndexInvalidAnnotation) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(-1, FPDFAnnot_GetFormControlIndex(form_handle(), annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldExportValueRadioButton) {
   // Open a file with radio button widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -3399,7 +3302,7 @@
                       form_handle(), /*annot=*/nullptr,
                       /*buffer=*/nullptr, /*buflen=*/0));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 6));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 6));
     ASSERT_TRUE(annot);
 
     // Checks for bad form handle.
@@ -3416,18 +3319,16 @@
                                                      buf.data(), length_bytes));
     EXPECT_EQ(L"value2", GetPlatformWString(buf.data()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldExportValueCheckBox) {
   // Open a file with checkbox widget annotations and load its first page.
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     unsigned long length_bytes =
@@ -3439,50 +3340,44 @@
                                                     buf.data(), length_bytes));
     EXPECT_EQ(L"Yes", GetPlatformWString(buf.data()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetFormFieldExportValueInvalidAnnotation) {
   // Open a file with ink annotations and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(0u, FPDFAnnot_GetFormFieldExportValue(form_handle(), annot.get(),
                                                     /*buffer=*/nullptr,
                                                     /*buflen=*/0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, Redactannotation) {
   ASSERT_TRUE(OpenDocument("redact_annot.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_REDACT, FPDFAnnot_GetSubtype(annot.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, PolygonAnnotation) {
   ASSERT_TRUE(OpenDocument("polygon_annot.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetVertices() positive testing.
@@ -3514,7 +3409,7 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // This has an odd number of elements in the vertices array, ignore the last
@@ -3535,21 +3430,20 @@
 
   {
     // Wrong annotation type.
-    ScopedFPDFAnnotation ink_annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_INK));
+    ScopedFPDFAnnotation ink_annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_INK));
     EXPECT_EQ(0U, FPDFAnnot_GetVertices(ink_annot.get(), nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, InkAnnotation) {
   ASSERT_TRUE(OpenDocument("ink_annot.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetInkListCount() and FPDFAnnot_GetInkListPath() positive
@@ -3593,7 +3487,7 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // This has an odd number of elements in the path array, ignore the last
@@ -3621,24 +3515,22 @@
   {
     // Wrong annotation type.
     ScopedFPDFAnnotation polygon_annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_POLYGON));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_POLYGON));
     EXPECT_EQ(0U, FPDFAnnot_GetInkListCount(polygon_annot.get()));
     const unsigned long kPathIndex = 0;
     EXPECT_EQ(0U, FPDFAnnot_GetInkListPath(polygon_annot.get(), kPathIndex,
                                            nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, LineAnnotation) {
   ASSERT_TRUE(OpenDocument("line_annot.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetVertices() positive testing.
@@ -3656,7 +3548,7 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Too few elements in the line array.
@@ -3667,23 +3559,22 @@
 
   {
     // Wrong annotation type.
-    ScopedFPDFAnnotation ink_annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_INK));
+    ScopedFPDFAnnotation ink_annot(
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_INK));
     FS_POINTF start;
     FS_POINTF end;
     EXPECT_FALSE(FPDFAnnot_GetLine(ink_annot.get(), &start, &end));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AnnotationBorder) {
   ASSERT_TRUE(OpenDocument("line_annot.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetBorder() positive testing.
@@ -3702,7 +3593,7 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
 
     // Too few elements in the border array.
@@ -3728,18 +3619,16 @@
                                      /*vertical_radius=*/2.5f,
                                      /*border_width=*/3.0f));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, AnnotationJavaScript) {
   ASSERT_TRUE(OpenDocument("annot_javascript.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetFormAdditionalActionJavaScript() positive testing.
@@ -3764,18 +3653,16 @@
                       form_handle(), annot.get(), FPDF_ANNOT_AACTION_KEY_STROKE,
                       nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, FormFieldAlternateName) {
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(8, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(8, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     // FPDFAnnot_GetFormFieldAlternateName() positive testing.
@@ -3793,8 +3680,6 @@
     EXPECT_EQ(0u, FPDFAnnot_GetFormFieldAlternateName(nullptr, annot.get(),
                                                       nullptr, 0));
   }
-
-  UnloadPage(page);
 }
 
 // Due to https://crbug.com/pdfium/570, the AnnotationBorder test above cannot
@@ -3802,9 +3687,9 @@
 // square annotation in annots.pdf for testing.
 TEST_F(FPDFAnnotEmbedderTest, AnnotationBorderRendering) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(1);
+  ScopedEmbedderTestPage page = LoadScopedPage(1);
   ASSERT_TRUE(page);
-  EXPECT_EQ(3, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(3, FPDFPage_GetAnnotCount(page.get()));
 
   const char* original_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -3840,12 +3725,13 @@
   }();
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 2));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 2));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_SQUARE, FPDFAnnot_GetSubtype(annot.get()));
 
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 612, 792, original_checksum);
     }
 
@@ -3854,32 +3740,32 @@
                                     /*border_width=*/4.0f));
 
     {
-      ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+      ScopedFPDFBitmap bitmap =
+          RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
       CompareBitmap(bitmap.get(), 612, 792, modified_checksum);
     }
   }
 
   // Save the document and close the page.
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   ASSERT_TRUE(OpenSavedDocument());
-  page = LoadSavedPage(1);
-  ASSERT_TRUE(page);
-  VerifySavedRendering(page, 612, 792, modified_checksum);
+  FPDF_PAGE saved_page = LoadSavedPage(1);
+  ASSERT_TRUE(saved_page);
+  VerifySavedRendering(saved_page, 612, 792, modified_checksum);
 
-  CloseSavedPage(page);
+  CloseSavedPage(saved_page);
   CloseSavedDocument();
 }
 
 TEST_F(FPDFAnnotEmbedderTest, GetAndAddFileAttachmentAnnotation) {
   ASSERT_TRUE(OpenDocument("annotation_fileattachment.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_FILEATTACHMENT, FPDFAnnot_GetSubtype(annot.get()));
 
@@ -3907,11 +3793,11 @@
   {
     // Add a file attachment annotation to the page.
     ScopedFPDFAnnotation annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_FILEATTACHMENT));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FILEATTACHMENT));
     ASSERT_TRUE(annot);
 
     // Check that there is now 2 annotations on this page.
-    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+    EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get()));
 
     ScopedFPDFWideString file_name = GetFPDFWideString(L"0.txt");
     FPDF_ATTACHMENT attachment =
@@ -3923,7 +3809,7 @@
   }
 
   {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(annot);
     EXPECT_EQ(FPDF_ANNOT_FILEATTACHMENT, FPDFAnnot_GetSubtype(annot.get()));
 
@@ -3939,26 +3825,24 @@
               FPDFAttachment_GetName(attachment, buf.data(), length_bytes));
     EXPECT_EQ(L"0.txt", GetPlatformWString(buf.data()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFAnnotEmbedderTest, BadCasesFileAttachmentAnnotation) {
   ASSERT_TRUE(OpenDocument("annotation_fileattachment.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page));
+  EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get()));
 
   {
     ASSERT_FALSE(FPDFAnnot_GetFileAttachment(nullptr));
 
     ScopedFPDFAnnotation text_annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_TEXT));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT));
     ASSERT_TRUE(text_annot);
     ASSERT_FALSE(FPDFAnnot_GetFileAttachment(text_annot.get()));
 
     ScopedFPDFAnnotation newly_file_annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_FILEATTACHMENT));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FILEATTACHMENT));
     ASSERT_TRUE(newly_file_annot);
     ASSERT_FALSE(FPDFAnnot_GetFileAttachment(newly_file_annot.get()));
   }
@@ -3971,7 +3855,7 @@
     ASSERT_FALSE(FPDFAnnot_AddFileAttachment(nullptr, empty_name.get()));
     ASSERT_FALSE(FPDFAnnot_AddFileAttachment(nullptr, not_empty_name.get()));
 
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0));
     ASSERT_TRUE(annot);
 
     ASSERT_FALSE(FPDFAnnot_AddFileAttachment(annot.get(), nullptr));
@@ -3981,6 +3865,4 @@
     EXPECT_NE(old_attachment,
               FPDFAnnot_AddFileAttachment(annot.get(), not_empty_name.get()));
   }
-
-  UnloadPage(page);
 }
diff --git a/fpdfsdk/fpdf_doc_embeddertest.cpp b/fpdfsdk/fpdf_doc_embeddertest.cpp
index 28e8584..49c8cd8 100644
--- a/fpdfsdk/fpdf_doc_embeddertest.cpp
+++ b/fpdfsdk/fpdf_doc_embeddertest.cpp
@@ -220,31 +220,27 @@
 TEST_F(FPDFDocEmbedderTest, Bug1506Second) {
   ASSERT_TRUE(OpenDocument("bug_1506.pdf"));
 
-  std::vector<FPDF_PAGE> pages;
-  for (int i : {0, 2})
-    pages.push_back(LoadPage(i));
+  std::vector<ScopedEmbedderTestPage> pages;
+  for (int i : {0, 2}) {
+    pages.push_back(LoadScopedPage(i));
+  }
 
   FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
   ASSERT_TRUE(dest);
   EXPECT_EQ(3, FPDFDest_GetDestPageIndex(document(), dest));
-
-  for (FPDF_PAGE page : pages)
-    UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, Bug1506Third) {
   ASSERT_TRUE(OpenDocument("bug_1506.pdf"));
 
-  std::vector<FPDF_PAGE> pages;
-  for (int i : {0, 1, 3})
-    pages.push_back(LoadPage(i));
+  std::vector<ScopedEmbedderTestPage> pages;
+  for (int i : {0, 1, 3}) {
+    pages.push_back(LoadScopedPage(i));
+  }
 
   FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
   ASSERT_TRUE(dest);
   EXPECT_EQ(3, FPDFDest_GetDestPageIndex(document(), dest));
-
-  for (FPDF_PAGE page : pages)
-    UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, Bug680376) {
@@ -259,20 +255,20 @@
 TEST_F(FPDFDocEmbedderTest, Bug821454) {
   ASSERT_TRUE(OpenDocument("bug_821454.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Cover some invalid argument cases while we're at it.
   EXPECT_FALSE(FPDFLink_GetLinkAtPoint(nullptr, 150, 360));
   EXPECT_EQ(-1, FPDFLink_GetLinkZOrderAtPoint(nullptr, 150, 360));
 
-  FPDF_LINK link1 = FPDFLink_GetLinkAtPoint(page, 150, 360);
+  FPDF_LINK link1 = FPDFLink_GetLinkAtPoint(page.get(), 150, 360);
   ASSERT_TRUE(link1);
-  FPDF_LINK link2 = FPDFLink_GetLinkAtPoint(page, 150, 420);
+  FPDF_LINK link2 = FPDFLink_GetLinkAtPoint(page.get(), 150, 420);
   ASSERT_TRUE(link2);
 
-  EXPECT_EQ(0, FPDFLink_GetLinkZOrderAtPoint(page, 150, 360));
-  EXPECT_EQ(1, FPDFLink_GetLinkZOrderAtPoint(page, 150, 420));
+  EXPECT_EQ(0, FPDFLink_GetLinkZOrderAtPoint(page.get(), 150, 360));
+  EXPECT_EQ(1, FPDFLink_GetLinkZOrderAtPoint(page.get(), 150, 420));
 
   FPDF_DEST dest1 = FPDFLink_GetDest(document(), link1);
   ASSERT_TRUE(dest1);
@@ -319,8 +315,6 @@
     EXPECT_FLOAT_EQ(150.0f, x);
     EXPECT_FLOAT_EQ(250.0f, y);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionBadArguments) {
@@ -338,11 +332,11 @@
 TEST_F(FPDFDocEmbedderTest, ActionLaunch) {
   ASSERT_TRUE(OpenDocument("launch_action.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -362,18 +356,16 @@
   // Other public methods are not appropriate for launch actions.
   EXPECT_FALSE(FPDFAction_GetDest(document(), action));
   EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionUri) {
   ASSERT_TRUE(OpenDocument("uri_action.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -393,18 +385,16 @@
   // Other public methods are not appropriate for URI actions
   EXPECT_FALSE(FPDFAction_GetDest(document(), action));
   EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionUriNonAscii) {
   ASSERT_TRUE(OpenDocument("uri_action_nonascii.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -424,40 +414,37 @@
   char buf[1024];
   EXPECT_EQ(bufsize, FPDFAction_GetURIPath(document(), action, buf, bufsize));
   EXPECT_STREQ(kExpectedResult, buf);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, LinkToAnnotConversion) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   {
-    FPDF_LINK first_link = FPDFLink_GetLinkAtPoint(page, 69.00, 653.00);
-    ScopedFPDFAnnotation first_annot(FPDFLink_GetAnnot(page, first_link));
-    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, first_annot.get()));
+    FPDF_LINK first_link = FPDFLink_GetLinkAtPoint(page.get(), 69.00, 653.00);
+    ScopedFPDFAnnotation first_annot(FPDFLink_GetAnnot(page.get(), first_link));
+    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page.get(), first_annot.get()));
 
-    FPDF_LINK second_link = FPDFLink_GetLinkAtPoint(page, 80.00, 633.00);
-    ScopedFPDFAnnotation second_annot(FPDFLink_GetAnnot(page, second_link));
-    EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page, second_annot.get()));
+    FPDF_LINK second_link = FPDFLink_GetLinkAtPoint(page.get(), 80.00, 633.00);
+    ScopedFPDFAnnotation second_annot(
+        FPDFLink_GetAnnot(page.get(), second_link));
+    EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page.get(), second_annot.get()));
 
     // Also test invalid arguments.
     EXPECT_FALSE(FPDFLink_GetAnnot(nullptr, nullptr));
-    EXPECT_FALSE(FPDFLink_GetAnnot(page, nullptr));
+    EXPECT_FALSE(FPDFLink_GetAnnot(page.get(), nullptr));
     EXPECT_FALSE(FPDFLink_GetAnnot(nullptr, second_link));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionGoto) {
   ASSERT_TRUE(OpenDocument("goto_action.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -471,18 +458,16 @@
   char buf[1024];
   EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
   EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionEmbeddedGoto) {
   ASSERT_TRUE(OpenDocument("gotoe_action.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -508,18 +493,16 @@
   EXPECT_EQ(kExpectedLength, bufsize);
   EXPECT_EQ(kExpectedLength, FPDFAction_GetFilePath(action, buf, bufsize));
   EXPECT_STREQ(kExpectedResult, buf);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, ActionNonesuch) {
   ASSERT_TRUE(OpenDocument("nonesuch_action.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The target action is nearly the size of the whole page.
-  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
+  FPDF_LINK link = FPDFLink_GetLinkAtPoint(page.get(), 100, 100);
   ASSERT_TRUE(link);
 
   FPDF_ACTION action = FPDFLink_GetAction(link);
@@ -532,8 +515,6 @@
   EXPECT_FALSE(FPDFAction_GetDest(document(), action));
   EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
   EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFDocEmbedderTest, NoBookmarks) {
@@ -691,53 +672,49 @@
   ASSERT_TRUE(OpenDocument("rectangles_multi_pages.pdf"));
   EXPECT_EQ(5, FPDF_GetPageCount(document()));
   for (int i = 0; i < 5; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     const PageData& expected = expected_page_data[i];
     CompareBitmap(bitmap.get(), expected.width, expected.height,
                   expected.checksum);
-    UnloadPage(page);
   }
 
   // Delete the first page and render again. (original page indices 1-4)
   FPDFPage_Delete(document(), 0);
   EXPECT_EQ(4, FPDF_GetPageCount(document()));
   for (int i = 0; i < 4; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     const PageData& expected = expected_page_data[i + 1];
     CompareBitmap(bitmap.get(), expected.width, expected.height,
                   expected.checksum);
-    UnloadPage(page);
   }
 
   // Delete the last page and render again. (original page indices 1-3)
   FPDFPage_Delete(document(), 3);
   EXPECT_EQ(3, FPDF_GetPageCount(document()));
   for (int i = 0; i < 3; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     const PageData& expected = expected_page_data[i + 1];
     CompareBitmap(bitmap.get(), expected.width, expected.height,
                   expected.checksum);
-    UnloadPage(page);
   }
 
   // Delete the middle page and render again. (original page indices 1, 3)
   FPDFPage_Delete(document(), 1);
   EXPECT_EQ(2, FPDF_GetPageCount(document()));
   for (int i = 0; i < 2; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     int adjusted_index = i == 0 ? 1 : 3;
     const PageData& expected = expected_page_data[adjusted_index];
     CompareBitmap(bitmap.get(), expected.width, expected.height,
                   expected.checksum);
-    UnloadPage(page);
   }
 }
 
@@ -949,15 +926,15 @@
 
 TEST_F(FPDFDocEmbedderTest, GetPageAAction) {
   ASSERT_TRUE(OpenDocument("get_page_aaction.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   EXPECT_FALSE(FPDF_GetPageAAction(nullptr, FPDFPAGE_AACTION_OPEN));
-  EXPECT_FALSE(FPDF_GetPageAAction(page, FPDFPAGE_AACTION_CLOSE));
-  EXPECT_FALSE(FPDF_GetPageAAction(page, -1));
-  EXPECT_FALSE(FPDF_GetPageAAction(page, 999));
+  EXPECT_FALSE(FPDF_GetPageAAction(page.get(), FPDFPAGE_AACTION_CLOSE));
+  EXPECT_FALSE(FPDF_GetPageAAction(page.get(), -1));
+  EXPECT_FALSE(FPDF_GetPageAAction(page.get(), 999));
 
-  FPDF_ACTION action = FPDF_GetPageAAction(page, FPDFPAGE_AACTION_OPEN);
+  FPDF_ACTION action = FPDF_GetPageAAction(page.get(), FPDFPAGE_AACTION_OPEN);
   EXPECT_EQ(static_cast<unsigned long>(PDFACTION_EMBEDDEDGOTO),
             FPDFAction_GetType(action));
 
@@ -970,13 +947,10 @@
   EXPECT_EQ(kExpectedLength, FPDFAction_GetFilePath(action, buf, bufsize));
   EXPECT_STREQ(kExpectedResult, buf);
 
-  UnloadPage(page);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(1);
 
-  page = LoadPage(1);
-  EXPECT_TRUE(page);
-  EXPECT_FALSE(FPDF_GetPageAAction(page, -1));
-
-  UnloadPage(page);
+  EXPECT_TRUE(page1.get());
+  EXPECT_FALSE(FPDF_GetPageAAction(page1.get(), -1));
 }
 
 TEST_F(FPDFDocEmbedderTest, NoPageLabels) {
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 9025e6b..8cae5c3 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -405,11 +405,10 @@
   ScopedFPDFBitmap orig_bitmap;
   {
     ASSERT_TRUE(OpenDocument("black.pdf"));
-    FPDF_PAGE orig_page = LoadPage(0);
+    ScopedEmbedderTestPage orig_page = LoadScopedPage(0);
     ASSERT_TRUE(orig_page);
-    orig_bitmap = RenderLoadedPage(orig_page);
+    orig_bitmap = RenderLoadedPage(orig_page.get());
     CompareBitmap(orig_bitmap.get(), 612, 792, kAllBlackChecksum);
-    UnloadPage(orig_page);
   }
 
   // Create a new document from |orig_bitmap| and save it.
@@ -626,12 +625,12 @@
 TEST_F(FPDFEditEmbedderTest, ClipPath) {
   // Load document with a clipped rectangle.
   ASSERT_TRUE(OpenDocument("clip_path.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT triangle = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT triangle = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(triangle);
 
   // Test that we got the expected triangle.
@@ -715,19 +714,17 @@
   EXPECT_EQ(35, y);
   EXPECT_EQ(FPDF_SEGMENT_LINETO, FPDFPathSegment_GetType(segment));
   EXPECT_FALSE(FPDFPathSegment_GetClose(segment));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, Bug1399) {
   // Load document with a clipped rectangle.
   ASSERT_TRUE(OpenDocument("bug_1399.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(7, FPDFPage_CountObjects(page));
+  ASSERT_EQ(7, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(obj);
 
   ASSERT_EQ(2, FPDFPath_CountSegments(obj));
@@ -754,8 +751,6 @@
   EXPECT_EQ(-1, FPDFClipPath_CountPaths(clip_path));
   EXPECT_EQ(-1, FPDFClipPath_CountPathSegments(clip_path, 0));
   EXPECT_FALSE(FPDFClipPath_GetPathSegment(clip_path, 0, 0));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, Bug1549) {
@@ -763,26 +758,25 @@
   static const char kRemovedChecksum[] = "6ec2f27531927882624b37bc7d8e12f4";
 
   ASSERT_TRUE(OpenDocument("bug_1549.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 100, 150, kOriginalChecksum);
 
-    ScopedFPDFPageObject obj(FPDFPage_GetObject(page, 0));
+    ScopedFPDFPageObject obj(FPDFPage_GetObject(page.get(), 0));
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj.get()));
-    ASSERT_TRUE(FPDFPage_RemoveObject(page, obj.get()));
+    ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), obj.get()));
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 100, 150, kRemovedChecksum);
   }
 
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // TODO(crbug.com/pdfium/1549): Should be `kRemovedChecksum`.
   VerifySavedDocument(100, 150, "4f9889cd5993db20f1ab37d677ac8d26");
@@ -791,19 +785,19 @@
 TEST_F(FPDFEditEmbedderTest, SetText) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get the "Hello, world!" text object and change it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   ScopedFPDFWideString text1 = GetFPDFWideString(L"Changed for SetText test");
   EXPECT_TRUE(FPDFText_SetText(page_object, text1.get()));
 
   // Verify the "Hello, world!" text is gone and "Changed for SetText test" is
   // now displayed.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   const char* changed_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -822,15 +816,14 @@
 #endif
   }();
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, changed_checksum);
   }
 
   // Now save the result.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   // Re-open the file and check the changes were kept in the saved .pdf.
   ASSERT_TRUE(OpenSavedDocument());
@@ -848,11 +841,11 @@
 
 TEST_F(FPDFEditEmbedderTest, SetCharcodesBadParams) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
 
   const uint32_t kDummyValue = 42;
@@ -861,14 +854,12 @@
   EXPECT_FALSE(FPDFText_SetCharcodes(nullptr, &kDummyValue, 0));
   EXPECT_FALSE(FPDFText_SetCharcodes(nullptr, &kDummyValue, 1));
   EXPECT_FALSE(FPDFText_SetCharcodes(page_object, nullptr, 1));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, SetTextKeepClippingPath) {
   // Load document with some text, with parts clipped.
   ASSERT_TRUE(OpenDocument("bug_1558.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   const char* original_checksum = []() {
@@ -889,19 +880,19 @@
   }();
   {
     // When opened before any editing and saving, the clipping path is rendered.
-    ScopedFPDFBitmap original_bitmap = RenderPage(page);
+    ScopedFPDFBitmap original_bitmap = RenderPage(page.get());
     CompareBitmap(original_bitmap.get(), 200, 200, original_checksum);
   }
 
   // "Change" the text in the objects to their current values to force them to
   // regenerate when saving.
   {
-    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(text_page);
-    const int obj_count = FPDFPage_CountObjects(page);
+    const int obj_count = FPDFPage_CountObjects(page.get());
     ASSERT_EQ(2, obj_count);
     for (int i = 0; i < obj_count; ++i) {
-      FPDF_PAGEOBJECT text_obj = FPDFPage_GetObject(page, i);
+      FPDF_PAGEOBJECT text_obj = FPDFPage_GetObject(page.get(), i);
       ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_obj));
       unsigned long size =
           FPDFTextObj_GetText(text_obj, text_page.get(),
@@ -916,14 +907,13 @@
 
   {
     // After editing but before saving, the clipping path is retained.
-    ScopedFPDFBitmap edited_bitmap = RenderPage(page);
+    ScopedFPDFBitmap edited_bitmap = RenderPage(page.get());
     CompareBitmap(edited_bitmap.get(), 200, 200, original_checksum);
   }
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Open the saved copy and render it.
   ASSERT_TRUE(OpenSavedDocument());
@@ -942,7 +932,7 @@
 TEST_F(FPDFEditEmbedderTest, Bug1574) {
   // Load document with some text within a clipping path.
   ASSERT_TRUE(OpenDocument("bug_1574.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   const char* original_checksum = []() {
@@ -963,18 +953,18 @@
   }();
   {
     // When opened before any editing and saving, the text object is rendered.
-    ScopedFPDFBitmap original_bitmap = RenderPage(page);
+    ScopedFPDFBitmap original_bitmap = RenderPage(page.get());
     CompareBitmap(original_bitmap.get(), 200, 300, original_checksum);
   }
 
   // "Change" the text in the objects to their current values to force them to
   // regenerate when saving.
   {
-    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(text_page);
 
-    ASSERT_EQ(2, FPDFPage_CountObjects(page));
-    FPDF_PAGEOBJECT text_obj = FPDFPage_GetObject(page, 1);
+    ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
+    FPDF_PAGEOBJECT text_obj = FPDFPage_GetObject(page.get(), 1);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_obj));
 
     unsigned long size = FPDFTextObj_GetText(text_obj, text_page.get(),
@@ -987,9 +977,8 @@
   }
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Open the saved copy and render it.
   ASSERT_TRUE(OpenSavedDocument());
@@ -1007,7 +996,7 @@
 
 TEST_F(FPDFEditEmbedderTest, Bug1893) {
   ASSERT_TRUE(OpenDocument("bug_1893.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   {
     const char* original_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -1026,11 +1015,11 @@
 #endif
     }();
 
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 200, 300, original_checksum);
   }
 
-  EXPECT_EQ(3, FPDFPage_CountObjects(page));
+  EXPECT_EQ(3, FPDFPage_CountObjects(page.get()));
 
   const char* removed_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -1051,16 +1040,15 @@
 
   // Remove the underline and regenerate the page content.
   {
-    ScopedFPDFPageObject object(FPDFPage_GetObject(page, 0));
-    ASSERT_TRUE(FPDFPage_RemoveObject(page, object.get()));
-    ASSERT_TRUE(FPDFPage_GenerateContent(page));
+    ScopedFPDFPageObject object(FPDFPage_GetObject(page.get(), 0));
+    ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), object.get()));
+    ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
 
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 200, 300, removed_checksum);
   }
 
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   {
     ASSERT_TRUE(OpenSavedDocument());
@@ -1075,12 +1063,12 @@
 TEST_F(FPDFEditEmbedderTest, RemoveTextObject) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Show what the original file looks like.
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
@@ -1088,40 +1076,40 @@
   // before calling FPDFPage_RemoveObject() below, so ASAN does not report
   // dangling pointers.
   {
-    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(text_page);
     EXPECT_EQ(30, FPDFText_CountChars(text_page.get()));
     EXPECT_EQ(0, FPDFText_GetFontWeight(text_page.get(), 0));
   }
 
   // Get the "Hello, world!" text object and remove it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
   {
-    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page, 0));
+    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page.get(), 0));
     ASSERT_TRUE(page_object);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(page_object.get()));
-    EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object.get()));
+    EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object.get()));
   }
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
   // Verify the "Hello, world!" text is gone.
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
   }
 
   // Create a new text page, which has updated results.
   {
-    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage text_page(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(text_page);
     EXPECT_EQ(15, FPDFText_CountChars(text_page.get()));
     EXPECT_EQ(0, FPDFText_GetFontWeight(text_page.get(), 0));
   }
 
   // Verify the rendering again after calling FPDFPage_GenerateContent().
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
   }
 
@@ -1133,51 +1121,49 @@
   EXPECT_THAT(GetString(), Not(HasSubstr("/F1")));
   EXPECT_THAT(GetString(), Not(HasSubstr("/F2")));
   EXPECT_THAT(GetString(), Not(HasSubstr("/Times-Roman")));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest,
        RemoveTextObjectWithTwoPagesSharingContentStreamAndResources) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_2_pages.pdf"));
-  FPDF_PAGE page1 = LoadPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(0);
   ASSERT_TRUE(page1);
-  FPDF_PAGE page2 = LoadPage(1);
+  ScopedEmbedderTestPage page2 = LoadScopedPage(1);
   ASSERT_TRUE(page2);
 
   // Show what the original file looks like.
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, HelloWorldChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Get the "Hello, world!" text object from page 1 and remove it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page1.get()));
   {
-    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1, 0));
+    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1.get(), 0));
     ASSERT_TRUE(page_object);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(page_object.get()));
-    EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
+    EXPECT_TRUE(FPDFPage_RemoveObject(page1.get(), page_object.get()));
   }
-  ASSERT_EQ(1, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page1.get()));
 
   // Verify the "Hello, world!" text is gone from page 1.
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Verify the rendering again after calling FPDFPage_GenerateContent().
-  ASSERT_TRUE(FPDFPage_GenerateContent(page1));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page1.get()));
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
@@ -1198,52 +1184,49 @@
   EXPECT_THAT(split_saved_data, Contains(HasSubstr("/F1")).Times(1));
   EXPECT_THAT(split_saved_data, Contains(HasSubstr("/F2")).Times(1));
   EXPECT_THAT(split_saved_data, Contains(HasSubstr("/Times-Roman")).Times(1));
-
-  UnloadPage(page1);
-  UnloadPage(page2);
 }
 
 TEST_F(FPDFEditEmbedderTest,
        RemoveTextObjectWithTwoPagesSharingContentArrayAndResources) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_2_pages_split_streams.pdf"));
-  FPDF_PAGE page1 = LoadPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(0);
   ASSERT_TRUE(page1);
-  FPDF_PAGE page2 = LoadPage(1);
+  ScopedEmbedderTestPage page2 = LoadScopedPage(1);
   ASSERT_TRUE(page2);
 
   // Show what the original file looks like.
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, HelloWorldChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Get the "Hello, world!" text object from page 1 and remove it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page1.get()));
   {
-    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1, 0));
+    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1.get(), 0));
     ASSERT_TRUE(page_object);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(page_object.get()));
-    EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
+    EXPECT_TRUE(FPDFPage_RemoveObject(page1.get(), page_object.get()));
   }
-  ASSERT_EQ(1, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page1.get()));
 
   // Verify the "Hello, world!" text is gone from page 1.
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Verify the rendering again after calling FPDFPage_GenerateContent().
-  ASSERT_TRUE(FPDFPage_GenerateContent(page1));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page1.get()));
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
@@ -1257,51 +1240,48 @@
   VerifySavedRendering(saved_page2, 200, 200, HelloWorldChecksum());
   CloseSavedPage(saved_page2);
   CloseSavedDocument();
-
-  UnloadPage(page1);
-  UnloadPage(page2);
 }
 
 TEST_F(FPDFEditEmbedderTest, RemoveTextObjectWithTwoPagesSharingResourcesDict) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_2_pages_shared_resources_dict.pdf"));
-  FPDF_PAGE page1 = LoadPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(0);
   ASSERT_TRUE(page1);
-  FPDF_PAGE page2 = LoadPage(1);
+  ScopedEmbedderTestPage page2 = LoadScopedPage(1);
   ASSERT_TRUE(page2);
 
   // Show what the original file looks like.
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, HelloWorldChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Get the "Hello, world!" text object from page 1 and remove it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page1.get()));
   {
-    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1, 0));
+    ScopedFPDFPageObject page_object(FPDFPage_GetObject(page1.get(), 0));
     ASSERT_TRUE(page_object);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(page_object.get()));
-    EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
+    EXPECT_TRUE(FPDFPage_RemoveObject(page1.get(), page_object.get()));
   }
-  ASSERT_EQ(1, FPDFPage_CountObjects(page1));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page1.get()));
 
   // Verify the "Hello, world!" text is gone from page 1
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Verify the rendering again after calling FPDFPage_GenerateContent().
-  ASSERT_TRUE(FPDFPage_GenerateContent(page1));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page1.get()));
   {
-    ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
+    ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get());
     CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
-    ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
+    ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get());
     CompareBitmap(page2_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
@@ -1315,9 +1295,6 @@
   VerifySavedRendering(saved_page2, 200, 200, HelloWorldChecksum());
   CloseSavedPage(saved_page2);
   CloseSavedDocument();
-
-  UnloadPage(page1);
-  UnloadPage(page2);
 }
 
 void CheckMarkCounts(FPDF_PAGE page,
@@ -1443,18 +1420,16 @@
 TEST_F(FPDFEditEmbedderTest, ReadMarkedObjectsIndirectDict) {
   // Load document with some text marked with an indirect property.
   ASSERT_TRUE(OpenDocument("text_in_page_marked_indirect.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  CheckMarkCounts(page, 1, 19, 8, 4, 9, 1);
-
-  UnloadPage(page);
+  CheckMarkCounts(page.get(), 1, 19, 8, 4, 9, 1);
 }
 
 TEST_F(FPDFEditEmbedderTest, RemoveMarkedObjectsPrime) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Show what the original file looks like.
@@ -1479,17 +1454,17 @@
       return "3d5a3de53d5866044c2b6bf339742c97";
 #endif  // BUILDFLAG(IS_APPLE)
     }();
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, original_checksum);
   }
 
   constexpr int expected_object_count = 19;
-  CheckMarkCounts(page, 1, expected_object_count, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, expected_object_count, 8, 4, 9, 1);
 
   // Get all objects marked with "Prime"
   std::vector<FPDF_PAGEOBJECT> primes;
   for (int i = 0; i < expected_object_count; ++i) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
 
     int mark_count = FPDFPageObj_CountMarks(page_object);
     for (int j = 0; j < mark_count; ++j) {
@@ -1511,11 +1486,11 @@
 
   // Remove all objects marked with "Prime".
   for (FPDF_PAGEOBJECT page_object : primes) {
-    EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+    EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
     FPDFPageObj_Destroy(page_object);
   }
 
-  EXPECT_EQ(11, FPDFPage_CountObjects(page));
+  EXPECT_EQ(11, FPDFPage_CountObjects(page.get()));
   const char* non_primes_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
 #if BUILDFLAG(IS_WIN)
@@ -1557,14 +1532,13 @@
 #endif  // BUILDFLAG(IS_APPLE)
   }();
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, non_primes_checksum);
   }
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the prime marks are not there anymore.
   ASSERT_TRUE(OpenSavedDocument());
@@ -1584,15 +1558,15 @@
 TEST_F(FPDFEditEmbedderTest, RemoveMarks) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjectCount = 19;
-  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, kExpectedObjectCount, 8, 4, 9, 1);
 
   // Remove all "Prime" content marks.
   for (int i = 0; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
 
     int mark_count = FPDFPageObj_CountMarks(page_object);
     for (int j = mark_count - 1; j >= 0; --j) {
@@ -1617,12 +1591,11 @@
   }
 
   // Verify there are 0 "Prime" content marks now.
-  CheckMarkCounts(page, 1, kExpectedObjectCount, 0, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, kExpectedObjectCount, 0, 4, 9, 1);
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the prime marks are not there anymore.
   ASSERT_TRUE(OpenSavedDocument());
@@ -1638,15 +1611,15 @@
 TEST_F(FPDFEditEmbedderTest, RemoveMarkParam) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjectCount = 19;
-  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, kExpectedObjectCount, 8, 4, 9, 1);
 
   // Remove all "Square" content marks parameters.
   for (int i = 0; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
 
     int mark_count = FPDFPageObj_CountMarks(page_object);
     for (int j = 0; j < mark_count; ++j) {
@@ -1677,9 +1650,8 @@
   }
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the "Factor" parameters are still gone.
   ASSERT_TRUE(OpenSavedDocument());
@@ -1723,24 +1695,23 @@
 TEST_F(FPDFEditEmbedderTest, MaintainMarkedObjects) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Iterate over all objects, counting the number of times each content mark
   // name appears.
-  CheckMarkCounts(page, 1, 19, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, 19, 8, 4, 9, 1);
 
   // Remove first page object.
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
-  EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
+  EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
   FPDFPageObj_Destroy(page_object);
 
-  CheckMarkCounts(page, 2, 18, 8, 3, 9, 1);
+  CheckMarkCounts(page.get(), 2, 18, 8, 3, 9, 1);
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   ASSERT_TRUE(OpenSavedDocument());
   FPDF_PAGE saved_page = LoadSavedPage(0);
@@ -1755,24 +1726,23 @@
 TEST_F(FPDFEditEmbedderTest, MaintainIndirectMarkedObjects) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked_indirect.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Iterate over all objects, counting the number of times each content mark
   // name appears.
-  CheckMarkCounts(page, 1, 19, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, 19, 8, 4, 9, 1);
 
   // Remove first page object.
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
-  EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
+  EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
   FPDFPageObj_Destroy(page_object);
 
-  CheckMarkCounts(page, 2, 18, 8, 3, 9, 1);
+  CheckMarkCounts(page.get(), 2, 18, 8, 3, 9, 1);
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   ASSERT_TRUE(OpenSavedDocument());
   FPDF_PAGE saved_page = LoadSavedPage(0);
@@ -1787,22 +1757,21 @@
 TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObject) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get the "Hello, world!" text object and remove it.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
-  EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
 
   // Verify the "Hello, world!" text is gone.
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
   FPDFPageObj_Destroy(page_object);
 
   // Re-open the file and check the page object count is still 1.
@@ -1817,18 +1786,18 @@
 TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsNotLonely) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_split_streams.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get the "Hello, world!" text object and remove it. There is another object
   // in the same stream that says "Goodbye, world!"
-  ASSERT_EQ(3, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(3, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
-  EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
 
   // Verify the "Hello, world!" text is gone.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
   const char* hello_removed_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
 #if BUILDFLAG(IS_WIN)
@@ -1846,14 +1815,13 @@
 #endif
   }();
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, hello_removed_checksum);
   }
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
   FPDFPageObj_Destroy(page_object);
 
   // Re-open the file and check the page object count is still 2.
@@ -1874,27 +1842,26 @@
 TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsLonely) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_split_streams.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get the "Greetings, world!" text object and remove it. This is the only
   // object in the stream.
-  ASSERT_EQ(3, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 2);
+  ASSERT_EQ(3, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 2);
   ASSERT_TRUE(page_object);
-  EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
 
   // Verify the "Greetings, world!" text is gone.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
   FPDFPageObj_Destroy(page_object);
 
   // Re-open the file and check the page object count is still 2.
@@ -1915,15 +1882,15 @@
 TEST_F(FPDFEditEmbedderTest, GetContentStream) {
   // Load document with some text split across streams.
   ASSERT_TRUE(OpenDocument("split_streams.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-14.
   // Content stream 1: page objects 15-17.
   // Content stream 2: page object 18.
-  ASSERT_EQ(19, FPDFPage_CountObjects(page));
+  ASSERT_EQ(19, FPDFPage_CountObjects(page.get()));
   for (int i = 0; i < 19; i++) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
     CPDF_PageObject* cpdf_page_object =
         CPDFPageObjectFromFPDFPageObject(page_object);
@@ -1934,41 +1901,39 @@
     else
       EXPECT_EQ(2, cpdf_page_object->GetContentStream()) << i;
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, RemoveAllFromStream) {
   // Load document with some text split across streams.
   ASSERT_TRUE(OpenDocument("split_streams.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-14.
   // Content stream 1: page objects 15-17.
   // Content stream 2: page object 18.
-  ASSERT_EQ(19, FPDFPage_CountObjects(page));
+  ASSERT_EQ(19, FPDFPage_CountObjects(page.get()));
 
   // Loop backwards because objects will being removed, which shifts the indexes
   // after the removed position.
   for (int i = 18; i >= 0; i--) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
     CPDF_PageObject* cpdf_page_object =
         CPDFPageObjectFromFPDFPageObject(page_object);
 
     // Empty content stream 1.
     if (cpdf_page_object->GetContentStream() == 1) {
-      EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
+      EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
       FPDFPageObj_Destroy(page_object);
     }
   }
 
   // Content stream 0: page objects 0-14.
   // Content stream 2: page object 15.
-  ASSERT_EQ(16, FPDFPage_CountObjects(page));
+  ASSERT_EQ(16, FPDFPage_CountObjects(page.get()));
   for (int i = 0; i < 16; i++) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
     CPDF_PageObject* cpdf_page_object =
         CPDFPageObjectFromFPDFPageObject(page_object);
@@ -1980,13 +1945,13 @@
 
   // Generate contents should remove the empty stream and update the page
   // objects' contents stream indexes.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   // Content stream 0: page objects 0-14.
   // Content stream 1: page object 15.
-  ASSERT_EQ(16, FPDFPage_CountObjects(page));
+  ASSERT_EQ(16, FPDFPage_CountObjects(page.get()));
   for (int i = 0; i < 16; i++) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
     CPDF_PageObject* cpdf_page_object =
         CPDFPageObjectFromFPDFPageObject(page_object);
@@ -2017,13 +1982,12 @@
 #endif  // BUILDFLAG(IS_APPLE)
   }();
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, stream1_removed_checksum);
   }
 
   // Save the file
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 16, and that
   // content stream 1 was removed.
@@ -2057,41 +2021,40 @@
 TEST_F(FPDFEditEmbedderTest, RemoveAllFromSingleStream) {
   // Load document with a single stream.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-1.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   // Loop backwards because objects will being removed, which shifts the indexes
   // after the removed position.
   for (int i = 1; i >= 0; i--) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
     CPDF_PageObject* cpdf_page_object =
         CPDFPageObjectFromFPDFPageObject(page_object);
     ASSERT_EQ(0, cpdf_page_object->GetContentStream());
-    ASSERT_TRUE(FPDFPage_RemoveObject(page, page_object));
+    ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
     FPDFPageObj_Destroy(page_object);
   }
 
   // No more objects in the stream
-  ASSERT_EQ(0, FPDFPage_CountObjects(page));
+  ASSERT_EQ(0, FPDFPage_CountObjects(page.get()));
 
   // Generate contents should remove the empty stream and update the page
   // objects' contents stream indexes.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
-  ASSERT_EQ(0, FPDFPage_CountObjects(page));
+  ASSERT_EQ(0, FPDFPage_CountObjects(page.get()));
 
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
   }
 
   // Save the file
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 0.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2111,45 +2074,44 @@
 TEST_F(FPDFEditEmbedderTest, RemoveFirstFromSingleStream) {
   // Load document with a single stream.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-1.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   // Remove first object.
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   CPDF_PageObject* cpdf_page_object =
       CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
-  ASSERT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
   FPDFPageObj_Destroy(page_object);
 
   // One object left in the stream.
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   // Still one object left in the stream.
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
 
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
   }
 
   // Save the file
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 0.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2173,46 +2135,45 @@
 TEST_F(FPDFEditEmbedderTest, RemoveLastFromSingleStream) {
   // Load document with a single stream.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-1.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   // Remove last object
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 1);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 1);
   ASSERT_TRUE(page_object);
   CPDF_PageObject* cpdf_page_object =
       CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
-  ASSERT_TRUE(FPDFPage_RemoveObject(page, page_object));
+  ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
   FPDFPageObj_Destroy(page_object);
 
   // One object left in the stream.
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   // Still one object left in the stream.
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  page_object = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  page_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(page_object);
   cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object);
   ASSERT_EQ(0, cpdf_page_object->GetContentStream());
 
   using pdfium::HelloWorldRemovedChecksum;
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, HelloWorldRemovedChecksum());
   }
 
   // Save the file
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 0.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2236,39 +2197,38 @@
 TEST_F(FPDFEditEmbedderTest, RemoveAllFromMultipleStreams) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world_split_streams.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Content stream 0: page objects 0-1.
   // Content stream 1: page object 2.
-  ASSERT_EQ(3, FPDFPage_CountObjects(page));
+  ASSERT_EQ(3, FPDFPage_CountObjects(page.get()));
 
   // Loop backwards because objects will being removed, which shifts the indexes
   // after the removed position.
   for (int i = 2; i >= 0; i--) {
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(page_object);
-    ASSERT_TRUE(FPDFPage_RemoveObject(page, page_object));
+    ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), page_object));
     FPDFPageObj_Destroy(page_object);
   }
 
   // No more objects in the page.
-  ASSERT_EQ(0, FPDFPage_CountObjects(page));
+  ASSERT_EQ(0, FPDFPage_CountObjects(page.get()));
 
   // Generate contents should remove the empty streams and update the page
   // objects' contents stream indexes.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
-  ASSERT_EQ(0, FPDFPage_CountObjects(page));
+  ASSERT_EQ(0, FPDFPage_CountObjects(page.get()));
 
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
   }
 
   // Save the file
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 0.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2288,23 +2248,22 @@
 TEST_F(FPDFEditEmbedderTest, InsertPageObjectAndSave) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Add a red rectangle.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
   FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255));
   EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, red_rect);
+  FPDFPage_InsertObject(page.get(), red_rect);
 
   // Verify the red rectangle was added.
-  ASSERT_EQ(3, FPDFPage_CountObjects(page));
+  ASSERT_EQ(3, FPDFPage_CountObjects(page.get()));
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 3.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2318,27 +2277,26 @@
 TEST_F(FPDFEditEmbedderTest, InsertPageObjectEditAndSave) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Add a red rectangle.
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
   FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 100, 100, 255));
   EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, red_rect);
+  FPDFPage_InsertObject(page.get(), red_rect);
 
   // Verify the red rectangle was added.
-  ASSERT_EQ(3, FPDFPage_CountObjects(page));
+  ASSERT_EQ(3, FPDFPage_CountObjects(page.get()));
 
   // Generate content but change it again
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255));
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the page object count is still 3.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2354,24 +2312,24 @@
 
   // Load document with many objects.
   ASSERT_TRUE(OpenDocument("many_rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   using pdfium::ManyRectanglesChecksum;
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 300, ManyRectanglesChecksum());
   }
 
   // Add a black rectangle.
-  ASSERT_EQ(kOriginalObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kOriginalObjectCount, FPDFPage_CountObjects(page.get()));
   FPDF_PAGEOBJECT black_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(black_rect, 0, 0, 0, 255));
   EXPECT_TRUE(FPDFPath_SetDrawMode(black_rect, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, black_rect);
+  FPDFPage_InsertObject(page.get(), black_rect);
 
   // Verify the black rectangle was added.
-  ASSERT_EQ(kOriginalObjectCount + 1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kOriginalObjectCount + 1, FPDFPage_CountObjects(page.get()));
   const char* plus_rectangle_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
       return "0d3715fcfb9bd0dd25dcce60800bff47";
@@ -2379,14 +2337,13 @@
     return "6b9396ab570754b32b04ca629e902f77";
   }();
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 300, plus_rectangle_checksum);
   }
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the rectangle added is still there.
   ASSERT_TRUE(OpenSavedDocument());
@@ -2502,14 +2459,14 @@
 TEST_F(FPDFEditEmbedderTest, PathOnTopOfText) {
   // Load document with some text
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Add an opaque rectangle on top of some of the text.
   FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255));
   EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, red_rect);
+  FPDFPage_InsertObject(page.get(), red_rect);
 
   // Add a transparent triangle on top of other part of the text.
   FPDF_PAGEOBJECT black_path = FPDFPageObj_CreateNewPath(20, 50);
@@ -2518,10 +2475,10 @@
   EXPECT_TRUE(FPDFPath_LineTo(black_path, 30, 80));
   EXPECT_TRUE(FPDFPath_LineTo(black_path, 40, 10));
   EXPECT_TRUE(FPDFPath_Close(black_path));
-  FPDFPage_InsertObject(page, black_path);
+  FPDFPage_InsertObject(page.get(), black_path);
 
   // Render and check the result.
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   const char* checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
 #if BUILDFLAG(IS_WIN)
@@ -2539,26 +2496,25 @@
 #endif
   }();
   CompareBitmap(bitmap.get(), 200, 200, checksum);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, EditOverExistingContent) {
   // Load document with existing content
   ASSERT_TRUE(OpenDocument("bug_717.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Add a transparent rectangle on top of the existing content
   FPDF_PAGEOBJECT red_rect2 = FPDFPageObj_CreateNewRect(90, 700, 25, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect2, 255, 0, 0, 100));
   EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect2, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, red_rect2);
+  FPDFPage_InsertObject(page.get(), red_rect2);
 
   // Add an opaque rectangle on top of the existing content
   FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(115, 700, 25, 50);
   EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255));
   EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0));
-  FPDFPage_InsertObject(page, red_rect);
+  FPDFPage_InsertObject(page.get(), red_rect);
 
   const char* original_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -2566,13 +2522,12 @@
     }
     return "ad04e5bd0f471a9a564fb034bd0fb073";
   }();
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 612, 792, original_checksum);
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   // Now save the result, closing the page and document
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   ASSERT_TRUE(OpenSavedDocument());
   FPDF_PAGE saved_page = LoadSavedPage(0);
@@ -2825,20 +2780,18 @@
 
 TEST_F(FPDFEditEmbedderTest, GetTextRenderMode) {
   ASSERT_TRUE(OpenDocument("text_render_mode.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   EXPECT_EQ(FPDF_TEXTRENDERMODE_UNKNOWN,
             FPDFTextObj_GetTextRenderMode(nullptr));
 
-  FPDF_PAGEOBJECT fill = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT fill = FPDFPage_GetObject(page.get(), 0);
   EXPECT_EQ(FPDF_TEXTRENDERMODE_FILL, FPDFTextObj_GetTextRenderMode(fill));
 
-  FPDF_PAGEOBJECT stroke = FPDFPage_GetObject(page, 1);
+  FPDF_PAGEOBJECT stroke = FPDFPage_GetObject(page.get(), 1);
   EXPECT_EQ(FPDF_TEXTRENDERMODE_STROKE, FPDFTextObj_GetTextRenderMode(stroke));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, SetTextRenderMode) {
@@ -2867,13 +2820,13 @@
 
   {
     ASSERT_TRUE(OpenDocument("text_render_mode.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
-    ASSERT_EQ(2, FPDFPage_CountObjects(page));
+    ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
     // Check the bitmap
     {
-      ScopedFPDFBitmap page_bitmap = RenderPage(page);
+      ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
       CompareBitmap(page_bitmap.get(), 612, 446, original_checksum);
     }
 
@@ -2883,7 +2836,7 @@
     EXPECT_FALSE(
         FPDFTextObj_SetTextRenderMode(nullptr, FPDF_TEXTRENDERMODE_INVISIBLE));
 
-    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+    FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
     ASSERT_TRUE(page_object);
     EXPECT_EQ(FPDF_TEXTRENDERMODE_FILL,
               FPDFTextObj_GetTextRenderMode(page_object));
@@ -2899,15 +2852,14 @@
 
     // Check that bitmap displays changed content
     {
-      ScopedFPDFBitmap page_bitmap = RenderPage(page);
+      ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
       CompareBitmap(page_bitmap.get(), 612, 446, stroke_checksum);
     }
 
     // Save a copy.
-    EXPECT_TRUE(FPDFPage_GenerateContent(page));
+    EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-    UnloadPage(page);
   }
 
   {
@@ -2945,10 +2897,10 @@
 
   // good object tests
   ASSERT_TRUE(OpenDocument("text_font.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(text);
   float font_size;
   ASSERT_TRUE(FPDFTextObj_GetFontSize(text, &font_size));
@@ -3072,21 +3024,19 @@
     ASSERT_EQ(1, FPDFFont_GetIsEmbedded(font));
     ASSERT_EQ(-1, FPDFFont_GetIsEmbedded(nullptr));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, NoEmbeddedFontData) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
 
   // Since hello_world.pdf does not embed any font data, FPDFFont_GetFontData()
   // will return the substitution font data. Since pdfium_embeddertest is
   // hermetic, this first object consistently maps to Tinos-Regular.ttf.
   constexpr size_t kTinosRegularSize = 469968;
-  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(text);
   FPDF_FONT font = FPDFTextObj_GetFont(text);
   ASSERT_TRUE(font);
@@ -3101,7 +3051,7 @@
 
   // Similarly, the second object consistently maps to Arimo-Regular.ttf.
   constexpr size_t kArimoRegularSize = 436180;
-  text = FPDFPage_GetObject(page, 1);
+  text = FPDFPage_GetObject(page.get(), 1);
   ASSERT_TRUE(text);
   font = FPDFTextObj_GetFont(text);
   ASSERT_TRUE(font);
@@ -3111,8 +3061,6 @@
   EXPECT_EQ(kArimoRegularSize, buf_bytes_required);
   EXPECT_EQ("7ac02a544211773d9636e056e9da6c35", GenerateMD5Base16(buf));
   EXPECT_EQ(0, FPDFFont_GetIsEmbedded(font));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, Type1BaseFontName) {
@@ -3153,10 +3101,10 @@
   EXPECT_FALSE(FPDFGlyphPath_GetGlyphPathSegment(nullptr, 1));
 
   ASSERT_TRUE(OpenDocument("text_font.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT text = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(text);
   FPDF_FONT font = FPDFTextObj_GetFont(text);
   ASSERT_TRUE(font);
@@ -3176,17 +3124,15 @@
   FPDF_PATHSEGMENT segment = FPDFGlyphPath_GetGlyphPathSegment(gpath, 1);
   ASSERT_TRUE(segment);
   EXPECT_EQ(FPDF_SEGMENT_BEZIERTO, FPDFPathSegment_GetType(segment));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, FormGetObjects) {
   ASSERT_TRUE(OpenDocument("form_object.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
   ASSERT_EQ(-1, FPDFFormObj_CountObjects(nullptr));
   ASSERT_EQ(2, FPDFFormObj_CountObjects(form));
@@ -3230,10 +3176,8 @@
   // Show that FPDFPage_RemoveObject() cannot remove page objects from within
   // `form`. This is working as intended, as FPDFPage_RemoveObject() only works
   // for page object within `page`.
-  EXPECT_FALSE(FPDFPage_RemoveObject(page, text1));
-  EXPECT_FALSE(FPDFPage_RemoveObject(page, text2));
-
-  UnloadPage(page);
+  EXPECT_FALSE(FPDFPage_RemoveObject(page.get(), text1));
+  EXPECT_FALSE(FPDFPage_RemoveObject(page.get(), text2));
 }
 
 TEST_F(FPDFEditEmbedderTest, ModifyFormObject) {
@@ -3271,30 +3215,28 @@
   }();
 
   ASSERT_TRUE(OpenDocument("form_object.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 62, 69, orig_checksum);
   }
 
-  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
 
   FPDFPageObj_Transform(form, 0.5, 0, 0, 0.5, 0, 0);
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 62, 69, new_checksum);
   }
 
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
   VerifySavedDocument(62, 69, new_checksum);
-
-  UnloadPage(page);
 }
 
 // Tests adding text from standard font using FPDFText_LoadStandardFont.
@@ -3651,11 +3593,10 @@
 TEST_F(FPDFEditEmbedderTest, NormalizeNegativeRotation) {
   // Load document with a -90 degree rotation
   ASSERT_TRUE(OpenDocument("bug_713197.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
-  EXPECT_EQ(3, FPDFPage_GetRotation(page));
-  UnloadPage(page);
+  EXPECT_EQ(3, FPDFPage_GetRotation(page.get()));
 }
 
 TEST_F(FPDFEditEmbedderTest, AddTrueTypeFontText) {
@@ -3717,20 +3658,19 @@
 TEST_F(FPDFEditEmbedderTest, TransformAnnot) {
   // Open a file with one annotation and load its first page.
   ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Add an underline annotation to the page without specifying its rectangle.
     ScopedFPDFAnnotation annot(
-        FPDFPage_CreateAnnot(page, FPDF_ANNOT_UNDERLINE));
+        FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_UNDERLINE));
     ASSERT_TRUE(annot);
 
     // FPDFPage_TransformAnnots() should run without errors when modifying
     // annotation rectangles.
-    FPDFPage_TransformAnnots(page, 1, 2, 3, 4, 5, 6);
+    FPDFPage_TransformAnnots(page.get(), 1, 2, 3, 4, 5, 6);
   }
-  UnloadPage(page);
 }
 
 // TODO(npm): Add tests using Japanese fonts in other OS.
@@ -3900,8 +3840,8 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("bug_779.pdf"));
-    FPDF_PAGE page = LoadPage(0);
-    ASSERT_NE(nullptr, page);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    ASSERT_NE(nullptr, page.get());
 
     // Now add a more complex green path.
     FPDF_PAGEOBJECT green_path = FPDFPageObj_CreateNewPath(20, 20);
@@ -3914,14 +3854,13 @@
     EXPECT_TRUE(FPDFPath_LineTo(green_path, 133, 33));
     EXPECT_TRUE(FPDFPath_BezierTo(green_path, 38, 33, 39, 36, 40, 40));
     EXPECT_TRUE(FPDFPath_Close(green_path));
-    FPDFPage_InsertObject(page, green_path);
-    ScopedFPDFBitmap page_bitmap = RenderLoadedPage(page);
+    FPDFPage_InsertObject(page.get(), green_path);
+    ScopedFPDFBitmap page_bitmap = RenderLoadedPage(page.get());
     CompareBitmap(page_bitmap.get(), 612, 792, checksum);
 
     // Now save the result, closing the page and document
-    EXPECT_TRUE(FPDFPage_GenerateContent(page));
+    EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-    UnloadPage(page);
   }
 
   VerifySavedDocument(612, 792, checksum);
@@ -3930,24 +3869,23 @@
 TEST_F(FPDFEditEmbedderTest, AddMark) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  CheckMarkCounts(page, 1, 19, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, 19, 8, 4, 9, 1);
 
   // Add to the first page object a "Bounds" mark with "Position": "First".
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_AddMark(page_object, "Bounds");
   EXPECT_TRUE(mark);
   EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), page_object, mark,
                                              "Position", "First"));
 
-  CheckMarkCounts(page, 1, 19, 8, 4, 9, 2);
+  CheckMarkCounts(page.get(), 1, 19, 8, 4, 9, 2);
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the new mark is present.
   ASSERT_TRUE(OpenSavedDocument());
@@ -3963,18 +3901,18 @@
 TEST_F(FPDFEditEmbedderTest, AddMarkCompressedStream) {
   // Load document with some text in a compressed stream.
   ASSERT_TRUE(OpenDocument("hello_world_compressed_stream.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Render and check there are no marks.
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
-  CheckMarkCounts(page, 0, 2, 0, 0, 0, 0);
+  CheckMarkCounts(page.get(), 0, 2, 0, 0, 0, 0);
 
   // Add to the first page object a "Bounds" mark with "Position": "First".
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_AddMark(page_object, "Bounds");
   EXPECT_TRUE(mark);
   EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), page_object, mark,
@@ -3982,15 +3920,14 @@
 
   // Render and check there is 1 mark.
   {
-    ScopedFPDFBitmap page_bitmap = RenderPage(page);
+    ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
     CompareBitmap(page_bitmap.get(), 200, 200, HelloWorldChecksum());
   }
-  CheckMarkCounts(page, 0, 2, 0, 0, 0, 1);
+  CheckMarkCounts(page.get(), 0, 2, 0, 0, 0, 1);
 
   // Save the file.
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and check the new mark is present.
   ASSERT_TRUE(OpenSavedDocument());
@@ -4010,14 +3947,14 @@
 TEST_F(FPDFEditEmbedderTest, SetMarkParam) {
   // Load document with some text.
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjectCount = 19;
-  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, kExpectedObjectCount, 8, 4, 9, 1);
 
   // Check the "Bounds" mark's "Position" param is "Last".
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 18);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 18);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_GetMark(page_object, 1);
   ASSERT_TRUE(mark);
   char buffer[256];
@@ -4037,12 +3974,12 @@
                                              "Position", "End"));
 
   // Verify the object passed must correspond to the mark passed.
-  FPDF_PAGEOBJECT another_page_object = FPDFPage_GetObject(page, 17);
+  FPDF_PAGEOBJECT another_page_object = FPDFPage_GetObject(page.get(), 17);
   EXPECT_FALSE(FPDFPageObjMark_SetStringParam(document(), another_page_object,
                                               mark, "Position", "End"));
 
   // Verify nothing else changed.
-  CheckMarkCounts(page, 1, kExpectedObjectCount, 8, 4, 9, 1);
+  CheckMarkCounts(page.get(), 1, kExpectedObjectCount, 8, 4, 9, 1);
 
   // Verify "Position" now maps to "End".
   EXPECT_TRUE(FPDFPageObjMark_GetParamStringValue(
@@ -4051,9 +3988,8 @@
             GetPlatformWString(reinterpret_cast<unsigned short*>(buffer)));
 
   // Save the file
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-  UnloadPage(page);
 
   // Re-open the file and cerify "Position" still maps to "End".
   ASSERT_TRUE(OpenSavedDocument());
@@ -4186,9 +4122,9 @@
 
 TEST_F(FPDFEditEmbedderTest, MarkGetName) {
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 18);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 18);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_GetMark(page_object, 1);
   ASSERT_TRUE(mark);
 
@@ -4213,15 +4149,13 @@
   EXPECT_EQ(999u, out_len);
 
   EXPECT_FALSE(FPDFPageObjMark_GetName(mark, buffer, sizeof(buffer), nullptr));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, MarkGetParamKey) {
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 18);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 18);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_GetMark(page_object, 1);
   ASSERT_TRUE(mark);
 
@@ -4253,15 +4187,13 @@
 
   EXPECT_FALSE(
       FPDFPageObjMark_GetParamKey(mark, 0, buffer, sizeof(buffer), nullptr));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, MarkGetIntParam) {
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 8);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 8);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_GetMark(page_object, 0);
   ASSERT_TRUE(mark);
 
@@ -4284,20 +4216,18 @@
 
   EXPECT_FALSE(FPDFPageObjMark_GetParamIntValue(mark, "Factor", nullptr));
 
-  page_object = FPDFPage_GetObject(page, 18);
+  page_object = FPDFPage_GetObject(page.get(), 18);
   mark = FPDFPageObj_GetMark(page_object, 1);
   out_value = 999;
   EXPECT_FALSE(FPDFPageObjMark_GetParamIntValue(mark, "Position", &out_value));
   EXPECT_EQ(999, out_value);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, MarkGetStringParam) {
   ASSERT_TRUE(OpenDocument("text_in_page_marked.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 18);
+  FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 18);
   FPDF_PAGEOBJECTMARK mark = FPDFPageObj_GetMark(page_object, 1);
   ASSERT_TRUE(mark);
 
@@ -4331,25 +4261,23 @@
   EXPECT_FALSE(FPDFPageObjMark_GetParamStringValue(mark, "Position", buffer,
                                                    sizeof(buffer), nullptr));
 
-  page_object = FPDFPage_GetObject(page, 8);
+  page_object = FPDFPage_GetObject(page.get(), 8);
   mark = FPDFPageObj_GetMark(page_object, 0);
   out_len = 999u;
   EXPECT_FALSE(FPDFPageObjMark_GetParamStringValue(mark, "Factor", buffer,
                                                    sizeof(buffer), &out_len));
   EXPECT_EQ(999u, out_len);
-
-  UnloadPage(page);
 }
 
 // See also FPDFStructTreeEmbedderTest.GetMarkedContentID, which traverses the
 // marked contents using FPDF_StructTree_GetForPage() and related API.
 TEST_F(FPDFEditEmbedderTest, TraverseMarkedContentID) {
   ASSERT_TRUE(OpenDocument("marked_content_id.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(2, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT object1 = FPDFPage_GetObject(page, 0);
+  ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT object1 = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(object1);
   ASSERT_EQ(1, FPDFPageObj_CountMarks(object1));
 
@@ -4372,7 +4300,7 @@
   EXPECT_EQ(FPDF_OBJECT_NAME,
             FPDFPageObjMark_GetParamValueType(mark11, "Type"));
 
-  FPDF_PAGEOBJECT object2 = FPDFPage_GetObject(page, 1);
+  FPDF_PAGEOBJECT object2 = FPDFPage_GetObject(page.get(), 1);
   ASSERT_TRUE(object2);
   ASSERT_EQ(2, FPDFPageObj_CountMarks(object2));
   EXPECT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(object2));
@@ -4398,22 +4326,20 @@
   EXPECT_EQ(18u, len);
   EXPECT_EQ(L"ClipSpan", GetPlatformWString(buf));
   EXPECT_EQ(0, FPDFPageObjMark_CountParams(mark22));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetBitmap) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(39, FPDFPage_CountObjects(page));
+  ASSERT_EQ(39, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 32);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 32);
   EXPECT_NE(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_FALSE(FPDFImageObj_GetBitmap(obj));
 
   {
-    obj = FPDFPage_GetObject(page, 33);
+    obj = FPDFPage_GetObject(page.get(), 33);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -4421,7 +4347,7 @@
   }
 
   {
-    obj = FPDFPage_GetObject(page, 34);
+    obj = FPDFPage_GetObject(page.get(), 34);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -4429,7 +4355,7 @@
   }
 
   {
-    obj = FPDFPage_GetObject(page, 35);
+    obj = FPDFPage_GetObject(page.get(), 35);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -4437,7 +4363,7 @@
   }
 
   {
-    obj = FPDFPage_GetObject(page, 36);
+    obj = FPDFPage_GetObject(page.get(), 36);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -4445,7 +4371,7 @@
   }
 
   {
-    obj = FPDFPage_GetObject(page, 37);
+    obj = FPDFPage_GetObject(page.get(), 37);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -4453,23 +4379,21 @@
   }
 
   {
-    obj = FPDFPage_GetObject(page, 38);
+    obj = FPDFPage_GetObject(page.get(), 38);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
     CompareBitmap(bitmap.get(), 194, 119, "a8f3a126cec274dab8242fd2ccdc1b8b");
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetBitmapIgnoresSetMatrix) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(39, FPDFPage_CountObjects(page));
+  ASSERT_EQ(39, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 33);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   {
@@ -4509,17 +4433,15 @@
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
     CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetBitmapForJBigImage) {
   ASSERT_TRUE(OpenDocument("bug_631912.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(1, FPDFPage_CountObjects(page));
+  ASSERT_EQ(1, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   {
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
@@ -4527,62 +4449,56 @@
     EXPECT_EQ(FPDFBitmap_Gray, FPDFBitmap_GetFormat(bitmap.get()));
     CompareBitmap(bitmap.get(), 1152, 720, "3f6a48e2b3e91b799bf34567f55cb4de");
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetBitmapIgnoresSMask) {
   ASSERT_TRUE(OpenDocument("matte.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjects = 4;
-  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page.get()));
 
   for (int i = 0; i < kExpectedObjects; ++i) {
-    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), i);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
     ASSERT_TRUE(bitmap);
     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
     CompareBitmap(bitmap.get(), 50, 50, "46c9a1dbe0b44765ce46017ad629a2fe");
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetBitmapWithArgbImageWithPalette) {
   ASSERT_TRUE(OpenDocument("bug_343075986.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjects = 2;
-  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 1);
+  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 1);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
   ASSERT_TRUE(bitmap);
   EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
   CompareBitmap(bitmap.get(), 4, 4, "49b4d39d3fd81c9853b493b615e475d1");
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapHandlesSetMatrix) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(39, FPDFPage_CountObjects(page));
+  ASSERT_EQ(39, FPDFPage_CountObjects(page.get()));
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 33);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   {
     // Render `obj` as is.
     ScopedFPDFBitmap bitmap(
-        FPDFImageObj_GetRenderedBitmap(document(), page, obj));
+        FPDFImageObj_GetRenderedBitmap(document(), page.get(), obj));
     EXPECT_EQ(FPDFBitmap_BGRA, FPDFBitmap_GetFormat(bitmap.get()));
     const char* checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -4620,7 +4536,7 @@
     // Render `obj` again. Note that the FPDFPageObj_SetMatrix() call has an
     // effect.
     ScopedFPDFBitmap bitmap(
-        FPDFImageObj_GetRenderedBitmap(document(), page, obj));
+        FPDFImageObj_GetRenderedBitmap(document(), page.get(), obj));
     EXPECT_EQ(FPDFBitmap_BGRA, FPDFBitmap_GetFormat(bitmap.get()));
     const char* checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -4630,17 +4546,15 @@
     }();
     CompareBitmap(bitmap.get(), 120, 43, checksum);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapHandlesSMask) {
   ASSERT_TRUE(OpenDocument("matte.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kExpectedObjects = 4;
-  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjects, FPDFPage_CountObjects(page.get()));
 
   const char* smask_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -4656,10 +4570,10 @@
   }();
 
   for (int i = 0; i < kExpectedObjects; ++i) {
-    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), i);
     ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
     ScopedFPDFBitmap bitmap(
-        FPDFImageObj_GetRenderedBitmap(document(), page, obj));
+        FPDFImageObj_GetRenderedBitmap(document(), page.get(), obj));
     ASSERT_TRUE(bitmap);
     EXPECT_EQ(FPDFBitmap_BGRA, FPDFBitmap_GetFormat(bitmap.get()));
     if (i == 0)
@@ -4667,41 +4581,38 @@
     else
       CompareBitmap(bitmap.get(), 40, 60, no_smask_checksum);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapBadParams) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 33);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   // Test various null parameters.
   EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, nullptr, nullptr));
   EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(document(), nullptr, nullptr));
-  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, page, nullptr));
+  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, page.get(), nullptr));
   EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, nullptr, obj));
-  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(document(), page, nullptr));
-  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, page, obj));
+  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(document(), page.get(), nullptr));
+  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(nullptr, page.get(), obj));
 
   // Test mismatch between document and page parameters.
   ScopedFPDFDocument new_document(FPDF_CreateNewDocument());
-  EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(new_document.get(), page, obj));
-
-  UnloadPage(page);
+  EXPECT_FALSE(
+      FPDFImageObj_GetRenderedBitmap(new_document.get(), page.get(), obj));
 }
 
 TEST_F(FPDFEditEmbedderTest, GetImageData) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(39, FPDFPage_CountObjects(page));
+  ASSERT_EQ(39, FPDFPage_CountObjects(page.get()));
 
   // Retrieve an image object with flate-encoded data stream.
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 33);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   // Check that the raw image data has the correct length and hash value.
@@ -4718,7 +4629,7 @@
   EXPECT_EQ(kEmbeddedImage33Checksum, GenerateMD5Base16(buf));
 
   // Retrieve an image object with DCTDecode-encoded data stream.
-  obj = FPDFPage_GetObject(page, 37);
+  obj = FPDFPage_GetObject(page.get(), 37);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   // Check that the raw image data has the correct length and hash value.
@@ -4736,20 +4647,18 @@
   buf.resize(len);
   EXPECT_EQ(4370u, FPDFImageObj_GetImageDataDecoded(obj, buf.data(), len));
   EXPECT_EQ("6aae1f3710335023a9e12191be66b64b", GenerateMD5Base16(buf));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetImageMatrix) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(39, FPDFPage_CountObjects(page));
+  ASSERT_EQ(39, FPDFPage_CountObjects(page.get()));
 
   FPDF_PAGEOBJECT obj;
   FS_MATRIX matrix;
 
-  obj = FPDFPage_GetObject(page, 33);
+  obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(53.0f, matrix.a);
@@ -4759,7 +4668,7 @@
   EXPECT_FLOAT_EQ(72.0f, matrix.e);
   EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
 
-  obj = FPDFPage_GetObject(page, 34);
+  obj = FPDFPage_GetObject(page.get(), 34);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(70.0f, matrix.a);
@@ -4769,7 +4678,7 @@
   EXPECT_FLOAT_EQ(216.0f, matrix.e);
   EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
 
-  obj = FPDFPage_GetObject(page, 35);
+  obj = FPDFPage_GetObject(page.get(), 35);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(69.0f, matrix.a);
@@ -4779,7 +4688,7 @@
   EXPECT_FLOAT_EQ(360.0f, matrix.e);
   EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
 
-  obj = FPDFPage_GetObject(page, 36);
+  obj = FPDFPage_GetObject(page.get(), 36);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(59.0f, matrix.a);
@@ -4789,7 +4698,7 @@
   EXPECT_FLOAT_EQ(72.0f, matrix.e);
   EXPECT_FLOAT_EQ(553.510009765625f, matrix.f);
 
-  obj = FPDFPage_GetObject(page, 37);
+  obj = FPDFPage_GetObject(page.get(), 37);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(55.94000244140625f, matrix.a);
@@ -4799,7 +4708,7 @@
   EXPECT_FLOAT_EQ(216.0f, matrix.e);
   EXPECT_FLOAT_EQ(552.510009765625f, matrix.f);
 
-  obj = FPDFPage_GetObject(page, 38);
+  obj = FPDFPage_GetObject(page.get(), 38);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
   EXPECT_FLOAT_EQ(70.528999328613281f, matrix.a);
@@ -4808,8 +4717,6 @@
   EXPECT_FLOAT_EQ(43.149997711181641f, matrix.d);
   EXPECT_FLOAT_EQ(360.0f, matrix.e);
   EXPECT_FLOAT_EQ(553.3599853515625f, matrix.f);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, DestroyPageObject) {
@@ -4822,17 +4729,17 @@
 
 TEST_F(FPDFEditEmbedderTest, GetImageFilters) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Verify that retrieving the filter of a non-image object would fail.
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 32);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 32);
   ASSERT_NE(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   ASSERT_EQ(0, FPDFImageObj_GetImageFilterCount(obj));
   EXPECT_EQ(0u, FPDFImageObj_GetImageFilter(obj, 0, nullptr, 0));
 
   // Verify the returned filter string for an image object with a single filter.
-  obj = FPDFPage_GetObject(page, 33);
+  obj = FPDFPage_GetObject(page.get(), 33);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   ASSERT_EQ(1, FPDFImageObj_GetImageFilterCount(obj));
   unsigned long len = FPDFImageObj_GetImageFilter(obj, 0, nullptr, 0);
@@ -4844,7 +4751,7 @@
   EXPECT_EQ(0u, FPDFImageObj_GetImageFilter(obj, 1, nullptr, 0));
 
   // Verify all the filters for an image object with a list of filters.
-  obj = FPDFPage_GetObject(page, 38);
+  obj = FPDFPage_GetObject(page.get(), 38);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   ASSERT_EQ(2, FPDFImageObj_GetImageFilterCount(obj));
   len = FPDFImageObj_GetImageFilter(obj, 0, nullptr, 0);
@@ -4862,22 +4769,20 @@
   EXPECT_EQ(sizeof(kDCTDecode),
             FPDFImageObj_GetImageFilter(obj, 1, buf.data(), len));
   EXPECT_STREQ(kDCTDecode, buf.data());
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetImageMetadata) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Check that getting the metadata of a null object would fail.
   FPDF_IMAGEOBJ_METADATA metadata;
-  EXPECT_FALSE(FPDFImageObj_GetImageMetadata(nullptr, page, &metadata));
+  EXPECT_FALSE(FPDFImageObj_GetImageMetadata(nullptr, page.get(), &metadata));
 
   // Check that receiving the metadata with a null metadata object would fail.
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 35);
-  EXPECT_FALSE(FPDFImageObj_GetImageMetadata(obj, page, nullptr));
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 35);
+  EXPECT_FALSE(FPDFImageObj_GetImageMetadata(obj, page.get(), nullptr));
 
   // Check that when retrieving an image object's metadata without passing in
   // |page|, all values are correct, with the last two being default values.
@@ -4892,7 +4797,7 @@
   EXPECT_EQ(FPDF_COLORSPACE_UNKNOWN, metadata.colorspace);
 
   // Verify the metadata of a bitmap image with indexed colorspace.
-  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page, &metadata));
+  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page.get(), &metadata));
   EXPECT_EQ(7, metadata.marked_content_id);
   EXPECT_EQ(92u, metadata.width);
   EXPECT_EQ(68u, metadata.height);
@@ -4902,9 +4807,9 @@
   EXPECT_EQ(FPDF_COLORSPACE_INDEXED, metadata.colorspace);
 
   // Verify the metadata of an image with RGB colorspace.
-  obj = FPDFPage_GetObject(page, 37);
+  obj = FPDFPage_GetObject(page.get(), 37);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
-  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page, &metadata));
+  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page.get(), &metadata));
   EXPECT_EQ(9, metadata.marked_content_id);
   EXPECT_EQ(126u, metadata.width);
   EXPECT_EQ(106u, metadata.height);
@@ -4912,20 +4817,18 @@
   EXPECT_FLOAT_EQ(162.555878f, metadata.vertical_dpi);
   EXPECT_EQ(24u, metadata.bits_per_pixel);
   EXPECT_EQ(FPDF_COLORSPACE_DEVICERGB, metadata.colorspace);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetImageMetadataJpxLzw) {
   ASSERT_TRUE(OpenDocument("jpx_lzw.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   FPDF_IMAGEOBJ_METADATA metadata;
-  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page, &metadata));
+  ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page.get(), &metadata));
   EXPECT_EQ(-1, metadata.marked_content_id);
   EXPECT_EQ(612u, metadata.width);
   EXPECT_EQ(792u, metadata.height);
@@ -4933,13 +4836,11 @@
   EXPECT_FLOAT_EQ(72.0f, metadata.vertical_dpi);
   EXPECT_EQ(24u, metadata.bits_per_pixel);
   EXPECT_EQ(FPDF_COLORSPACE_UNKNOWN, metadata.colorspace);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetImagePixelSize) {
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Check that getting the size of a null object would fail.
@@ -4949,7 +4850,7 @@
 
   // Check that receiving the size with a null width and height pointers would
   // fail.
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 35);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 35);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   EXPECT_FALSE(FPDFImageObj_GetImagePixelSize(obj, nullptr, nullptr));
   EXPECT_FALSE(FPDFImageObj_GetImagePixelSize(obj, nullptr, &height));
@@ -4960,26 +4861,24 @@
   EXPECT_EQ(92u, width);
   EXPECT_EQ(68u, height);
 
-  obj = FPDFPage_GetObject(page, 37);
+  obj = FPDFPage_GetObject(page.get(), 37);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
   ASSERT_TRUE(FPDFImageObj_GetImagePixelSize(obj, &width, &height));
   EXPECT_EQ(126u, width);
   EXPECT_EQ(106u, height);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForHelloWorldText) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 0);
+    FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 0);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_object));
 
     ScopedFPDFBitmap bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
+        FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 1));
     ASSERT_TRUE(bitmap);
     const char* checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -4995,8 +4894,8 @@
     }();
     CompareBitmap(bitmap.get(), 64, 11, checksum);
 
-    ScopedFPDFBitmap x2_bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
+    ScopedFPDFBitmap x2_bitmap(FPDFTextObj_GetRenderedBitmap(
+        document(), page.get(), text_object, 2.4f));
     ASSERT_TRUE(x2_bitmap);
     const char* x2_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5013,7 +4912,7 @@
     CompareBitmap(x2_bitmap.get(), 153, 25, x2_checksum);
 
     ScopedFPDFBitmap x10_bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
+        FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 10));
     ASSERT_TRUE(x10_bitmap);
     const char* x10_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5031,11 +4930,11 @@
   }
 
   {
-    FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 1);
+    FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 1);
     ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_object));
 
     ScopedFPDFBitmap bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
+        FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 1));
     ASSERT_TRUE(bitmap);
     const char* checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5051,8 +4950,8 @@
     }();
     CompareBitmap(bitmap.get(), 116, 16, checksum);
 
-    ScopedFPDFBitmap x2_bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
+    ScopedFPDFBitmap x2_bitmap(FPDFTextObj_GetRenderedBitmap(
+        document(), page.get(), text_object, 2.4f));
     ASSERT_TRUE(x2_bitmap);
     const char* x2_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5069,7 +4968,7 @@
     CompareBitmap(x2_bitmap.get(), 276, 36, x2_checksum);
 
     ScopedFPDFBitmap x10_bitmap(
-        FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
+        FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 10));
     ASSERT_TRUE(x10_bitmap);
     const char* x10_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5085,20 +4984,18 @@
     }();
     CompareBitmap(x10_bitmap.get(), 1143, 150, x10_checksum);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForRotatedText) {
   ASSERT_TRUE(OpenDocument("rotated_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_object));
 
   ScopedFPDFBitmap bitmap(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 1));
   ASSERT_TRUE(bitmap);
   const char* checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5115,7 +5012,7 @@
   CompareBitmap(bitmap.get(), 29, 28, checksum);
 
   ScopedFPDFBitmap x2_bitmap(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 2.4f));
   ASSERT_TRUE(x2_bitmap);
   const char* x2_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5132,7 +5029,7 @@
   CompareBitmap(x2_bitmap.get(), 67, 67, x2_checksum);
 
   ScopedFPDFBitmap x10_bitmap(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 10));
   ASSERT_TRUE(x10_bitmap);
   const char* x10_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5147,20 +5044,18 @@
     return "bbd3842a4b50dbfcbce4eee2b067a297";
   }();
   CompareBitmap(x10_bitmap.get(), 275, 275, x10_checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForColorText) {
   ASSERT_TRUE(OpenDocument("text_color.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_object));
 
   ScopedFPDFBitmap bitmap(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 7.3f));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 7.3f));
   ASSERT_TRUE(bitmap);
   const char* checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -5169,8 +5064,6 @@
     return "e8154fa8ededf4d9b8b35b5260897b6c";
   }();
   CompareBitmap(bitmap.get(), 120, 186, checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForNewlyCreatedText) {
@@ -5204,36 +5097,42 @@
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForTextWithBadParameters) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(text_object);
 
   // Simple bad parameters testing.
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, nullptr, nullptr, 0));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), nullptr, nullptr, 0));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page, nullptr, 0));
+  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page.get(), nullptr, 0));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, nullptr, text_object, 0));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, nullptr, nullptr, 1));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page, nullptr, 0));
+  EXPECT_FALSE(
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), nullptr, 0));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), nullptr, nullptr, 1));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page, text_object, 0));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page, nullptr, 1));
+  EXPECT_FALSE(
+      FPDFTextObj_GetRenderedBitmap(nullptr, page.get(), text_object, 0));
+  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page.get(), nullptr, 1));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, nullptr, text_object, 1));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page, nullptr, 1));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(nullptr, page, text_object, 1));
+  EXPECT_FALSE(
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), nullptr, 1));
+  EXPECT_FALSE(
+      FPDFTextObj_GetRenderedBitmap(nullptr, page.get(), text_object, 1));
 
   // Test bad scale values.
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 0));
   EXPECT_FALSE(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, -1));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, 0));
   EXPECT_FALSE(
-      FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10000));
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object, -1));
+  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page.get(),
+                                             text_object, 10000));
   EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(
-      document(), page, text_object, std::numeric_limits<float>::max()));
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(
-      document(), page, text_object, std::numeric_limits<float>::infinity()));
+      document(), page.get(), text_object, std::numeric_limits<float>::max()));
+  EXPECT_FALSE(
+      FPDFTextObj_GetRenderedBitmap(document(), page.get(), text_object,
+                                    std::numeric_limits<float>::infinity()));
 
   {
     // `text_object` will render without `page`, but may not render correctly
@@ -5245,10 +5144,8 @@
 
   // Mismatch between the document and the page fails too.
   ScopedFPDFDocument empty_document(FPDF_CreateNewDocument());
-  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(empty_document.get(), page,
+  EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(empty_document.get(), page.get(),
                                              text_object, 1));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetRenderedBitmapForRotatedImage) {
@@ -5288,7 +5185,7 @@
 
 TEST_F(FPDFEditEmbedderTest, MultipleGraphicsStates) {
   ASSERT_TRUE(OpenDocument("multiple_graphics_states.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
@@ -5299,21 +5196,19 @@
     EXPECT_TRUE(FPDFPath_LineTo(path.get(), 100, 125));
     EXPECT_TRUE(FPDFPath_Close(path.get()));
 
-    FPDFPage_InsertObject(page, path.release());
-    EXPECT_TRUE(FPDFPage_GenerateContent(page));
+    FPDFPage_InsertObject(page.get(), path.release());
+    EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   }
 
   const char* checksum = CFX_DefaultRenderDevice::UseSkiaRenderer()
                              ? "7ebec75d95c64b522999a710de76c52c"
                              : "f4b36616a7fea81a4f06cc7b01a55ac1";
 
-  ScopedFPDFBitmap bitmap = RenderPage(page);
+  ScopedFPDFBitmap bitmap = RenderPage(page.get());
   CompareBitmap(bitmap.get(), 200, 300, checksum);
 
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
   VerifySavedDocument(200, 300, checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditEmbedderTest, GetAndSetMatrixForFormWithText) {
@@ -5321,16 +5216,16 @@
   constexpr int kExpectedHeight = 200;
 
   OpenDocument("form_object_with_text.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   HelloWorldChecksum());
   }
 
-  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(form);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
 
@@ -5345,7 +5240,7 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(form, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   HelloWorldChecksum());
   }
@@ -5364,21 +5259,20 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(text, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   HelloWorldChecksum());
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   HelloWorldChecksum());
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedWidth, kExpectedHeight, HelloWorldChecksum());
 }
@@ -5407,11 +5301,10 @@
 
  private:
   std::string HashForPage(int page_index) {
-    FPDF_PAGE page = LoadPage(page_index);
+    ScopedEmbedderTestPage page = LoadScopedPage(page_index);
     EXPECT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     std::string hash = HashBitmap(bitmap.get());
-    UnloadPage(page);
     return hash;
   }
 };
diff --git a/fpdfsdk/fpdf_editimg_embeddertest.cpp b/fpdfsdk/fpdf_editimg_embeddertest.cpp
index 2c3efdb..0f26b12 100644
--- a/fpdfsdk/fpdf_editimg_embeddertest.cpp
+++ b/fpdfsdk/fpdf_editimg_embeddertest.cpp
@@ -181,16 +181,16 @@
   constexpr char kExpectedChecksum[] = "617b1d57c30c516beee86e0781ff7810";
 
   OpenDocument("bug_2132.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT image = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(image);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
 
@@ -205,21 +205,20 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(image, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedWidth, kExpectedHeight, kExpectedChecksum);
 }
@@ -230,16 +229,16 @@
   constexpr char kExpectedChecksum[] = "fcb9007fd901d2052e2bd1c147b82800";
 
   OpenDocument("form_object_with_image.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(form);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
 
@@ -254,7 +253,7 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(form, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
@@ -273,21 +272,20 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(image, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
                   kExpectedChecksum);
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedWidth, kExpectedHeight, kExpectedChecksum);
 }
diff --git a/fpdfsdk/fpdf_editpage_embeddertest.cpp b/fpdfsdk/fpdf_editpage_embeddertest.cpp
index 44daff9..a62cb71 100644
--- a/fpdfsdk/fpdf_editpage_embeddertest.cpp
+++ b/fpdfsdk/fpdf_editpage_embeddertest.cpp
@@ -29,37 +29,36 @@
 
   {
     ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
     {
       // Render the page as is.
-      EXPECT_EQ(0, FPDFPage_GetRotation(page));
-      const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
-      const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
+      EXPECT_EQ(0, FPDFPage_GetRotation(page.get()));
+      const int page_width = static_cast<int>(FPDF_GetPageWidth(page.get()));
+      const int page_height = static_cast<int>(FPDF_GetPageHeight(page.get()));
       EXPECT_EQ(200, page_width);
       EXPECT_EQ(300, page_height);
-      ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+      ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
       CompareBitmap(bitmap.get(), page_width, page_height,
                     pdfium::RectanglesChecksum());
     }
 
-    FPDFPage_SetRotation(page, 1);
+    FPDFPage_SetRotation(page.get(), 1);
 
     {
       // Render the page after rotation.
       // Note that the change affects the rendering, as expected.
       // It behaves just like the case below, rather than the case above.
-      EXPECT_EQ(1, FPDFPage_GetRotation(page));
-      const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
-      const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
+      EXPECT_EQ(1, FPDFPage_GetRotation(page.get()));
+      const int page_width = static_cast<int>(FPDF_GetPageWidth(page.get()));
+      const int page_height = static_cast<int>(FPDF_GetPageHeight(page.get()));
       EXPECT_EQ(300, page_width);
       EXPECT_EQ(200, page_height);
-      ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+      ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
       CompareBitmap(bitmap.get(), page_width, page_height, rotated_checksum);
     }
 
-    UnloadPage(page);
   }
 
   {
@@ -86,19 +85,17 @@
 TEST_F(FPDFEditPageEmbedderTest, HasTransparencyImage) {
   constexpr int kExpectedObjectCount = 39;
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
 
   for (int i = 0; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), i);
     EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
 
     FPDFPageObj_SetFillColor(obj, 255, 0, 0, 127);
     EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, HasTransparencyInvalid) {
@@ -108,50 +105,46 @@
 TEST_F(FPDFEditPageEmbedderTest, HasTransparencyPath) {
   constexpr int kExpectedObjectCount = 8;
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
 
   for (int i = 0; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), i);
     EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
 
     FPDFPageObj_SetStrokeColor(obj, 63, 63, 0, 127);
     EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, HasTransparencyText) {
   constexpr int kExpectedObjectCount = 2;
   ASSERT_TRUE(OpenDocument("text_render_mode.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
 
   for (int i = 0; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), i);
     EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
 
     FPDFPageObj_SetBlendMode(obj, "Lighten");
     EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetFillAndStrokeForImage) {
   constexpr int kExpectedObjectCount = 39;
   constexpr int kImageObjectsStartIndex = 33;
   ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
 
   for (int i = kImageObjectsStartIndex; i < kExpectedObjectCount; ++i) {
-    FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, i);
+    FPDF_PAGEOBJECT image = FPDFPage_GetObject(page.get(), i);
     ASSERT_TRUE(image);
     EXPECT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
 
@@ -162,8 +155,6 @@
     EXPECT_FALSE(FPDFPageObj_GetFillColor(image, &r, &g, &b, &a));
     EXPECT_FALSE(FPDFPageObj_GetStrokeColor(image, &r, &g, &b, &a));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, DashingArrayAndPhase) {
@@ -193,13 +184,13 @@
 
   constexpr int kExpectedObjectCount = 3;
   ASSERT_TRUE(OpenDocument("dashed_lines.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
+  ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
 
   {
-    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 0);
+    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page.get(), 0);
     ASSERT_TRUE(path);
     EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
 
@@ -219,7 +210,7 @@
   }
 
   {
-    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 1);
+    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page.get(), 1);
     ASSERT_TRUE(path);
     EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
 
@@ -255,7 +246,7 @@
   }
 
   {
-    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 2);
+    FPDF_PAGEOBJECT path = FPDFPage_GetObject(page.get(), 2);
     ASSERT_TRUE(path);
     EXPECT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
 
@@ -302,32 +293,28 @@
     EXPECT_TRUE(FPDFPageObj_GetDashPhase(path, &phase));
     EXPECT_FLOAT_EQ(4.0f, phase);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetRotatedBoundsBadParameters) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
 
   FS_QUADPOINTSF quad;
   ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(nullptr, nullptr));
   ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(obj, nullptr));
   ASSERT_FALSE(FPDFPageObj_GetRotatedBounds(nullptr, &quad));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetBoundsForNormalText) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
 
   constexpr float kExpectedLeft = 20.348f;
@@ -355,16 +342,14 @@
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y3);
   EXPECT_FLOAT_EQ(kExpectedLeft, quad.x4);
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetBoundsForRotatedText) {
   ASSERT_TRUE(OpenDocument("rotated_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(obj));
 
   constexpr float kExpectedLeft = 98.9478f;
@@ -392,16 +377,14 @@
   EXPECT_FLOAT_EQ(85.447739f, quad.y3);
   EXPECT_FLOAT_EQ(106.13486f, quad.x4);
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetBoundsForNormalImage) {
   ASSERT_TRUE(OpenDocument("matte.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 2);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 2);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   constexpr float kExpectedLeft = 0.0f;
@@ -429,16 +412,14 @@
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y3);
   EXPECT_FLOAT_EQ(kExpectedLeft, quad.x4);
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, GetBoundsForRotatedImage) {
   ASSERT_TRUE(OpenDocument("rotated_image.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page.get(), 0);
   ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
 
   constexpr float kExpectedLeft = 100.0f;
@@ -466,8 +447,6 @@
   EXPECT_FLOAT_EQ(110.0f, quad.y3);
   EXPECT_FLOAT_EQ(140.0f, quad.x4);
   EXPECT_FLOAT_EQ(kExpectedTop, quad.y4);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFEditPageEmbedderTest, VerifyDashArraySaved) {
diff --git a/fpdfsdk/fpdf_editpath_embeddertest.cpp b/fpdfsdk/fpdf_editpath_embeddertest.cpp
index e23d98c..b412a11 100644
--- a/fpdfsdk/fpdf_editpath_embeddertest.cpp
+++ b/fpdfsdk/fpdf_editpath_embeddertest.cpp
@@ -92,16 +92,16 @@
 
 TEST_F(FPDFEditPathEmbedderTest, GetAndSetMatrixForPath) {
   OpenDocument("rectangles_double_flipped.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  FPDF_PAGEOBJECT path = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT path = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(path);
   ASSERT_EQ(FPDF_PAGEOBJ_PATH, FPDFPageObj_GetType(path));
 
@@ -116,21 +116,20 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(path, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
                       RectanglesChecksum());
@@ -138,16 +137,16 @@
 
 TEST_F(FPDFEditPathEmbedderTest, GetAndSetMatrixForFormWithPath) {
   OpenDocument("form_object_with_path.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+  FPDF_PAGEOBJECT form = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(form);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
 
@@ -162,7 +161,7 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(form, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
@@ -181,21 +180,20 @@
 
   ASSERT_TRUE(FPDFPageObj_SetMatrix(path, &matrix));
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  ASSERT_TRUE(FPDFPage_GenerateContent(page));
+  ASSERT_TRUE(FPDFPage_GenerateContent(page.get()));
   ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
                       RectanglesChecksum());
@@ -203,35 +201,34 @@
 
 TEST_F(FPDFEditPathEmbedderTest, AddPathToRectangles) {
   OpenDocument("rectangles.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
   ScopedFPDFPageObject path = CreateBlackTriangle();
   ASSERT_TRUE(path);
-  FPDFPage_InsertObject(page, path.release());
+  FPDFPage_InsertObject(page.get(), path.release());
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
   }
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
                       RectanglesAndTriangleChecksum());
@@ -239,35 +236,34 @@
 
 TEST_F(FPDFEditPathEmbedderTest, AddPathToRectanglesWithLeakyCTM) {
   OpenDocument("rectangles_with_leaky_ctm.pdf");
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesChecksum());
   }
 
   ScopedFPDFPageObject path = CreateBlackTriangle();
   ASSERT_TRUE(path);
-  FPDFPage_InsertObject(page, path.release());
+  FPDFPage_InsertObject(page.get(), path.release());
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
   }
 
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), kExpectedRectangleWidth,
                   kExpectedRectangleHeight, RectanglesAndTriangleChecksum());
   }
 
-  UnloadPage(page);
 
   VerifySavedDocument(kExpectedRectangleWidth, kExpectedRectangleHeight,
                       RectanglesAndTriangleChecksum());
diff --git a/fpdfsdk/fpdf_flatten_embeddertest.cpp b/fpdfsdk/fpdf_flatten_embeddertest.cpp
index f5562a7..c54c921 100644
--- a/fpdfsdk/fpdf_flatten_embeddertest.cpp
+++ b/fpdfsdk/fpdf_flatten_embeddertest.cpp
@@ -21,53 +21,49 @@
 
 TEST_F(FPDFFlattenEmbedderTest, FlatNothing) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  EXPECT_EQ(FLATTEN_NOTHINGTODO, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY));
-  UnloadPage(page);
+  EXPECT_EQ(FLATTEN_NOTHINGTODO,
+            FPDFPage_Flatten(page.get(), FLAT_NORMALDISPLAY));
 }
 
 TEST_F(FPDFFlattenEmbedderTest, FlatNormal) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY));
-  UnloadPage(page);
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_NORMALDISPLAY));
 }
 
 TEST_F(FPDFFlattenEmbedderTest, FlatPrint) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
-  UnloadPage(page);
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
 }
 
 TEST_F(FPDFFlattenEmbedderTest, FlatWithBadFont) {
   ASSERT_TRUE(OpenDocument("344775293.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
-  FORM_OnLButtonDown(form_handle(), page, 0, 20, 30);
-  FORM_OnLButtonUp(form_handle(), page, 0, 20, 30);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 20, 30);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 20, 30);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   EXPECT_THAT(GetString(), Not(HasSubstr("/PDFDocEncoding")));
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFlattenEmbedderTest, FlatWithFontNoBaseEncoding) {
   ASSERT_TRUE(OpenDocument("363015187.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
   EXPECT_THAT(GetString(), HasSubstr("/Differences"));
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFlattenEmbedderTest, Bug861842) {
@@ -87,16 +83,15 @@
   }();
 
   ASSERT_TRUE(OpenDocument("bug_861842.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 100, 120, checkbox_checksum);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   // TODO(crbug.com/861842): This should not render blank.
   static constexpr char kBlankPageHash[] = "48400809c3862dae64b0cd00d51057a4";
@@ -138,17 +133,16 @@
   }();
 
   ASSERT_TRUE(OpenDocument("bug_889099.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // The original document has a malformed media box; the height is -400.
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 300, 400, page_checksum);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   VerifySavedDocument(300, 400, flattened_page_checksum);
 }
@@ -161,16 +155,15 @@
     return "6c674642154408e877d88c6c082d67e9";
   }();
   ASSERT_TRUE(OpenDocument("bug_890322.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 200, 200, checksum);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   VerifySavedDocument(200, 200, checksum);
 }
@@ -183,16 +176,15 @@
     return "f71ab085c52c8445ae785eca3ec858b1";
   }();
   ASSERT_TRUE(OpenDocument("bug_896366.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT);
+  ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(bitmap.get(), 612, 792, checksum);
 
-  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT));
+  EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT));
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-  UnloadPage(page);
 
   VerifySavedDocument(612, 792, checksum);
 }
diff --git a/fpdfsdk/fpdf_formfill_embeddertest.cpp b/fpdfsdk/fpdf_formfill_embeddertest.cpp
index 97e5cf6..ca23996 100644
--- a/fpdfsdk/fpdf_formfill_embeddertest.cpp
+++ b/fpdfsdk/fpdf_formfill_embeddertest.cpp
@@ -605,9 +605,8 @@
   SetDelegate(&mock);
 
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug487928) {
@@ -615,11 +614,10 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_487928.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(5000);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug507316) {
@@ -627,23 +625,20 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_507316.pdf"));
-  FPDF_PAGE page = LoadPage(2);
+  ScopedEmbedderTestPage page = LoadScopedPage(2);
   EXPECT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(4000);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug514690) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   // Test that FORM_OnMouseMove() etc. permit null HANDLES and PAGES.
-  FORM_OnMouseMove(nullptr, page, 0, 10.0, 10.0);
+  FORM_OnMouseMove(nullptr, page.get(), 0, 10.0, 10.0);
   FORM_OnMouseMove(form_handle(), nullptr, 0, 10.0, 10.0);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug900552) {
@@ -651,7 +646,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_900552.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(4000);
@@ -659,9 +654,9 @@
   // Simulate a repaint.
   FPDF_BITMAP bitmap = FPDFBitmap_Create(512, 512, 0);
   ASSERT_TRUE(bitmap);
-  FPDF_RenderPageBitmap_Start(bitmap, page, 0, 0, 512, 512, 0, 0, nullptr);
+  FPDF_RenderPageBitmap_Start(bitmap, page.get(), 0, 0, 512, 512, 0, 0,
+                              nullptr);
   FPDFBitmap_Destroy(bitmap);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug901654Case1) {
@@ -669,7 +664,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_901654.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(4000);
@@ -677,10 +672,9 @@
   // Simulate a repaint.
   {
     ScopedFPDFBitmap bitmap(FPDFBitmap_Create(512, 512, 0));
-    FPDF_RenderPageBitmap_Start(bitmap.get(), page, 0, 0, 512, 512, 0, 0,
+    FPDF_RenderPageBitmap_Start(bitmap.get(), page.get(), 0, 0, 512, 512, 0, 0,
                                 nullptr);
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug901654Case2) {
@@ -688,7 +682,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_901654_2.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(4000);
@@ -696,17 +690,16 @@
   // Simulate a repaint.
   {
     ScopedFPDFBitmap bitmap(FPDFBitmap_Create(512, 512, 0));
-    FPDF_RenderPageBitmap_Start(bitmap.get(), page, 0, 0, 512, 512, 0, 0,
+    FPDF_RenderPageBitmap_Start(bitmap.get(), page.get(), 0, 0, 512, 512, 0, 0,
                                 nullptr);
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, GetFocusedAnnotation) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  std::vector<FPDF_PAGE> pages;
+  std::vector<ScopedEmbedderTestPage> pages;
   for (size_t i = 0; i < 3; ++i) {
-    pages.push_back(LoadPage(i));
+    pages.push_back(LoadScopedPage(i));
     ASSERT_TRUE(pages.back());
   }
 
@@ -727,31 +720,29 @@
 
   for (size_t i = 0; i < pages.size(); ++i) {
     // Invoke click on the form field to bring it to focus.
-    FORM_OnMouseMove(form_handle(), pages[i], 0, right_bottom_annot_point.x,
-                     right_bottom_annot_point.y);
-    FORM_OnLButtonDown(form_handle(), pages[i], 0, right_bottom_annot_point.x,
-                       right_bottom_annot_point.y);
-    FORM_OnLButtonUp(form_handle(), pages[i], 0, right_bottom_annot_point.x,
-                     right_bottom_annot_point.y);
+    FORM_OnMouseMove(form_handle(), pages[i].get(), 0,
+                     right_bottom_annot_point.x, right_bottom_annot_point.y);
+    FORM_OnLButtonDown(form_handle(), pages[i].get(), 0,
+                       right_bottom_annot_point.x, right_bottom_annot_point.y);
+    FORM_OnLButtonUp(form_handle(), pages[i].get(), 0,
+                     right_bottom_annot_point.x, right_bottom_annot_point.y);
 
     ASSERT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
     ASSERT_TRUE(annot);
 
-    EXPECT_EQ(kExpectedAnnotIndex, FPDFPage_GetAnnotIndex(pages[i], annot));
+    EXPECT_EQ(kExpectedAnnotIndex,
+              FPDFPage_GetAnnotIndex(pages[i].get(), annot));
     EXPECT_EQ(static_cast<int>(i), page_index);
 
     FPDFPage_CloseAnnot(annot);
   }
-
-  for (FPDF_PAGE page : pages)
-    UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, SetFocusedAnnotation) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  std::vector<FPDF_PAGE> pages;
+  std::vector<ScopedEmbedderTestPage> pages;
   for (size_t i = 0; i < 3; ++i) {
-    pages.push_back(LoadPage(i));
+    pages.push_back(LoadScopedPage(i));
     ASSERT_TRUE(pages.back());
   }
 
@@ -771,132 +762,120 @@
   for (size_t i = 0; i < pages.size(); ++i) {
     // Setting focus on an annotation on page i.
     ScopedFPDFAnnotation focused_annot(
-        FPDFPage_GetAnnot(pages[i], kExpectedAnnotIndex));
+        FPDFPage_GetAnnot(pages[i].get(), kExpectedAnnotIndex));
     ASSERT_TRUE(focused_annot);
 
     ASSERT_TRUE(FORM_SetFocusedAnnot(form_handle(), focused_annot.get()));
 
     ASSERT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
-    EXPECT_EQ(kExpectedAnnotIndex, FPDFPage_GetAnnotIndex(pages[i], annot));
+    EXPECT_EQ(kExpectedAnnotIndex,
+              FPDFPage_GetAnnotIndex(pages[i].get(), annot));
     EXPECT_EQ(static_cast<int>(i), page_index);
 
     FPDFPage_CloseAnnot(annot);
   }
-
-  for (FPDF_PAGE page : pages)
-    UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, FormFillFirstTab) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
   int page_index = -2;
   FPDF_ANNOTATION annot = nullptr;
   EXPECT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
   EXPECT_EQ(0, page_index);
   ASSERT_TRUE(annot);
-  EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page, annot));
+  EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page.get(), annot));
   FPDFPage_CloseAnnot(annot);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, FormFillFirstShiftTab) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first shift-tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                              FWL_EVENTFLAG_ShiftKey));
   int page_index = -2;
   FPDF_ANNOTATION annot = nullptr;
   EXPECT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
   EXPECT_EQ(0, page_index);
   ASSERT_TRUE(annot);
-  EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, annot));
+  EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page.get(), annot));
   FPDFPage_CloseAnnot(annot);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, FormFillContinuousTab) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Tabs should iterate focus over annotations.
   for (int expected : {1, 2, 3, 0}) {
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
     int page_index = -2;
     FPDF_ANNOTATION annot = nullptr;
     EXPECT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
     EXPECT_EQ(0, page_index);
     ASSERT_TRUE(annot);
-    EXPECT_EQ(expected, FPDFPage_GetAnnotIndex(page, annot));
+    EXPECT_EQ(expected, FPDFPage_GetAnnotIndex(page.get(), annot));
     FPDFPage_CloseAnnot(annot);
   }
 
   // Tab should not be handled as the last annotation of the page is in focus.
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
-
-  UnloadPage(page);
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, FormFillContinuousShiftTab) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Shift-tabs should iterate focus over annotations.
   for (int expected : {0, 3, 2, 1}) {
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                                FWL_EVENTFLAG_ShiftKey));
     int page_index = -2;
     FPDF_ANNOTATION annot = nullptr;
     EXPECT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
     EXPECT_EQ(0, page_index);
     ASSERT_TRUE(annot);
-    EXPECT_EQ(expected, FPDFPage_GetAnnotIndex(page, annot));
+    EXPECT_EQ(expected, FPDFPage_GetAnnotIndex(page.get(), annot));
     FPDFPage_CloseAnnot(annot);
   }
 
   // Shift-tab should not be handled as the first annotation of the page is in
   // focus.
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                               FWL_EVENTFLAG_ShiftKey));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, TabWithModifiers) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                               FWL_EVENTFLAG_ControlKey));
 
-  ASSERT_FALSE(
-      FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, FWL_EVENTFLAG_AltKey));
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
+                              FWL_EVENTFLAG_AltKey));
 
   ASSERT_FALSE(
-      FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+      FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                      (FWL_EVENTFLAG_ControlKey | FWL_EVENTFLAG_ShiftKey)));
 
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                               (FWL_EVENTFLAG_AltKey | FWL_EVENTFLAG_ShiftKey)));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, KeyPressWithNoFocusedAnnot) {
   ASSERT_TRUE(OpenDocument("annotiter.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // There should be no focused annotation to start with.
@@ -913,80 +892,70 @@
   };
   for (int key : kKeysToPress) {
     // Pressing random keys when there is no focus should not trigger focus.
-    EXPECT_FALSE(FORM_OnKeyDown(form_handle(), page, key, 0));
+    EXPECT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), key, 0));
     page_index = -2;
     annot = nullptr;
     EXPECT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
     EXPECT_EQ(-1, page_index);
     EXPECT_FALSE(annot);
   }
-
-  UnloadPage(page);
 }
 
 #ifdef PDF_ENABLE_XFA
 TEST_F(FPDFFormFillEmbedderTest, XFAFormFillFirstTab) {
   ASSERT_TRUE(OpenDocument("xfa/email_recommended.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
-
-  UnloadPage(page);
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, XFAFormFillFirstShiftTab) {
   ASSERT_TRUE(OpenDocument("xfa/email_recommended.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first shift-tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                              FWL_EVENTFLAG_ShiftKey));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, XFAFormFillContinuousTab) {
   ASSERT_TRUE(OpenDocument("xfa/email_recommended.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 
   // Subsequent tabs should move focus over annotations.
   for (size_t i = 0; i < 9; ++i)
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 
   // Tab should not be handled as the last annotation of the page is in focus.
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
-
-  UnloadPage(page);
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, XFAFormFillContinuousShiftTab) {
   ASSERT_TRUE(OpenDocument("xfa/email_recommended.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Invoking first shift-tab on the page.
-  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                              FWL_EVENTFLAG_ShiftKey));
 
   // Subsequent shift-tabs should move focus over annotations.
   for (size_t i = 0; i < 9; ++i) {
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                                FWL_EVENTFLAG_ShiftKey));
   }
 
   // Shift-tab should not be handled as the first annotation of the page is in
   // focus.
-  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+  ASSERT_FALSE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                               FWL_EVENTFLAG_ShiftKey));
-
-  UnloadPage(page);
 }
 #endif  // PDF_ENABLE_XFA
 
@@ -1002,11 +971,9 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("redirect.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, CheckReadOnlyInCheckbox) {
@@ -1014,34 +981,35 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Check for read-only checkbox.
-    ScopedFPDFAnnotation focused_annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation focused_annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(FORM_SetFocusedAnnot(form_handle(), focused_annot.get()));
 
     // Shift-tab to the previous control.
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab,
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab,
                                FWL_EVENTFLAG_ShiftKey));
     FPDF_ANNOTATION annot = nullptr;
     int page_index = -1;
     ASSERT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
-    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, annot));
+    EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page.get(), annot));
 
     // The read-only checkbox is initially in checked state.
     EXPECT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot));
 
-    EXPECT_TRUE(FORM_OnChar(form_handle(), page, pdfium::ascii::kReturn, 0));
+    EXPECT_TRUE(
+        FORM_OnChar(form_handle(), page.get(), pdfium::ascii::kReturn, 0));
     EXPECT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot));
 
-    EXPECT_TRUE(FORM_OnChar(form_handle(), page, pdfium::ascii::kSpace, 0));
+    EXPECT_TRUE(
+        FORM_OnChar(form_handle(), page.get(), pdfium::ascii::kSpace, 0));
     EXPECT_TRUE(FPDFAnnot_IsChecked(form_handle(), annot));
 
     FPDFPage_CloseAnnot(annot);
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, CheckReadOnlyInRadiobutton) {
@@ -1049,33 +1017,34 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("click_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Check for read-only radio button.
-    ScopedFPDFAnnotation focused_annot(FPDFPage_GetAnnot(page, 1));
+    ScopedFPDFAnnotation focused_annot(FPDFPage_GetAnnot(page.get(), 1));
     ASSERT_TRUE(FORM_SetFocusedAnnot(form_handle(), focused_annot.get()));
 
     // Tab to the next control.
-    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page, FWL_VKEY_Tab, 0));
+    ASSERT_TRUE(FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Tab, 0));
 
     FPDF_ANNOTATION annot = nullptr;
     int page_index = -1;
     ASSERT_TRUE(FORM_GetFocusedAnnot(form_handle(), &page_index, &annot));
-    EXPECT_EQ(2, FPDFPage_GetAnnotIndex(page, annot));
+    EXPECT_EQ(2, FPDFPage_GetAnnotIndex(page.get(), annot));
     // The read-only radio button is initially in checked state.
     EXPECT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot));
 
-    EXPECT_TRUE(FORM_OnChar(form_handle(), page, pdfium::ascii::kReturn, 0));
+    EXPECT_TRUE(
+        FORM_OnChar(form_handle(), page.get(), pdfium::ascii::kReturn, 0));
     EXPECT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot));
 
-    EXPECT_TRUE(FORM_OnChar(form_handle(), page, pdfium::ascii::kSpace, 0));
+    EXPECT_TRUE(
+        FORM_OnChar(form_handle(), page.get(), pdfium::ascii::kSpace, 0));
     EXPECT_FALSE(FPDFAnnot_IsChecked(form_handle(), annot));
 
     FPDFPage_CloseAnnot(annot);
   }
-  UnloadPage(page);
 }
 
 #ifdef PDF_ENABLE_V8
@@ -1085,7 +1054,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocumentWithoutJavaScript("bug_551248.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
 
@@ -1106,7 +1075,6 @@
   EXPECT_EQ(0U, alerts.size());  // nothing fired.
   delegate.AdvanceTime(1000);
   EXPECT_EQ(0U, alerts.size());  // nothing fired.
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, DocumentAActions) {
@@ -1114,7 +1082,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("document_aactions.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   const auto& alerts = delegate.GetAlerts();
@@ -1124,7 +1092,6 @@
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_DS);
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_WP);
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_DP);
-  UnloadPage(page);
 
   ASSERT_EQ(4U, alerts.size());
   EXPECT_EQ(L"Will Save", alerts[0].message);
@@ -1138,7 +1105,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocumentWithoutJavaScript("document_aactions.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   const auto& alerts = delegate.GetAlerts();
@@ -1148,7 +1115,6 @@
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_DS);
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_WP);
   FORM_DoDocumentAAction(form_handle(), FPDFDOC_AACTION_DP);
-  UnloadPage(page);
 
   ASSERT_EQ(0U, alerts.size());
 }
@@ -1159,7 +1125,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_551248.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
 
@@ -1180,7 +1146,6 @@
   EXPECT_EQ(4U, alerts.size());  // interval fired again.
   delegate.AdvanceTime(1000);
   EXPECT_EQ(4U, alerts.size());  // nothing fired.
-  UnloadPage(page);
 
   ASSERT_EQ(4U, alerts.size());  // nothing else fired.
 
@@ -1211,11 +1176,10 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_620428.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
   delegate.AdvanceTime(5000);
-  UnloadPage(page);
 
   const auto& alerts = delegate.GetAlerts();
   ASSERT_EQ(1U, alerts.size());
@@ -1228,7 +1192,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_634394.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
 
@@ -1239,7 +1203,6 @@
   delegate.AdvanceTime(1000);
   delegate.AdvanceTime(1000);
   delegate.AdvanceTime(1000);
-  UnloadPage(page);
 
   const auto& alerts = delegate.GetAlerts();
   EXPECT_EQ(2U, alerts.size());
@@ -1250,7 +1213,7 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_634716.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
   DoOpenActions();
 
@@ -1261,7 +1224,6 @@
   delegate.AdvanceTime(1000);
   delegate.AdvanceTime(1000);
   delegate.AdvanceTime(1000);
-  UnloadPage(page);
 
   const auto& alerts = delegate.GetAlerts();
   EXPECT_EQ(2U, alerts.size());
@@ -1272,13 +1234,12 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_679649.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   delegate.SetFailNextTimer();
   DoOpenActions();
   delegate.AdvanceTime(2000);
-  UnloadPage(page);
 
   const auto& alerts = delegate.GetAlerts();
   EXPECT_EQ(0u, alerts.size());
@@ -1289,14 +1250,13 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_707673.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   DoOpenActions();
-  FORM_OnLButtonDown(form_handle(), page, 0, 140, 590);
-  FORM_OnLButtonUp(form_handle(), page, 0, 140, 590);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 140, 590);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 140, 590);
   delegate.AdvanceTime(1000);
-  UnloadPage(page);
 
   const auto& alerts = delegate.GetAlerts();
   EXPECT_EQ(0u, alerts.size());
@@ -1304,13 +1264,12 @@
 
 TEST_F(FPDFFormFillEmbedderTest, Bug765384) {
   ASSERT_TRUE(OpenDocument("bug_765384.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   DoOpenActions();
-  FORM_OnLButtonDown(form_handle(), page, 0, 140, 590);
-  FORM_OnLButtonUp(form_handle(), page, 0, 140, 590);
-  UnloadPage(page);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 140, 590);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 140, 590);
 }
 
 // Test passes if DCHECK() not hit.
@@ -1319,13 +1278,12 @@
   SetDelegate(&delegate);
 
   ASSERT_TRUE(OpenDocument("bug_1477093.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   DoOpenActions();
   delegate.AdvanceTime(1000);
   delegate.AdvanceTime(1000);
-  UnloadPage(page);
 }
 
 #endif  // PDF_ENABLE_V8
@@ -1365,46 +1323,44 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("text_form.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page.get());
     CompareBitmap(bitmap1.get(), 300, 300, TextFormChecksum());
 
     // Click on the textfield
-    EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
-              FPDFPage_HasFormFieldAtPoint(form_handle(), page, 120.0, 120.0));
     EXPECT_EQ(
-        0, FPDFPage_FormFieldZOrderAtPoint(form_handle(), page, 120.0, 120.0));
-    FORM_OnMouseMove(form_handle(), page, 0, 120.0, 120.0);
-    FORM_OnLButtonDown(form_handle(), page, 0, 120.0, 120.0);
-    FORM_OnLButtonUp(form_handle(), page, 0, 120.0, 120.0);
+        FPDF_FORMFIELD_TEXTFIELD,
+        FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 120.0, 120.0));
+    EXPECT_EQ(0, FPDFPage_FormFieldZOrderAtPoint(form_handle(), page.get(),
+                                                 120.0, 120.0));
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 120.0, 120.0);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 120.0, 120.0);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 120.0, 120.0);
 
     // Write "ABC"
-    FORM_OnChar(form_handle(), page, 'A', 0);
-    FORM_OnChar(form_handle(), page, 'B', 0);
-    FORM_OnChar(form_handle(), page, 'C', 0);
-    ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page);
+    FORM_OnChar(form_handle(), page.get(), 'A', 0);
+    FORM_OnChar(form_handle(), page.get(), 'B', 0);
+    FORM_OnChar(form_handle(), page.get(), 'C', 0);
+    ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page.get());
     CompareBitmap(bitmap2.get(), 300, 300, focused_text_form_with_abc_checksum);
 
     // Focus remains despite right clicking out of the textfield
-    FORM_OnMouseMove(form_handle(), page, 0, 15.0, 15.0);
-    FORM_OnRButtonDown(form_handle(), page, 0, 15.0, 15.0);
-    FORM_OnRButtonUp(form_handle(), page, 0, 15.0, 15.0);
-    ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page);
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 15.0, 15.0);
+    FORM_OnRButtonDown(form_handle(), page.get(), 0, 15.0, 15.0);
+    FORM_OnRButtonUp(form_handle(), page.get(), 0, 15.0, 15.0);
+    ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page.get());
     CompareBitmap(bitmap3.get(), 300, 300, focused_text_form_with_abc_checksum);
 
     // Take out focus by clicking out of the textfield
-    FORM_OnMouseMove(form_handle(), page, 0, 15.0, 15.0);
-    FORM_OnLButtonDown(form_handle(), page, 0, 15.0, 15.0);
-    FORM_OnLButtonUp(form_handle(), page, 0, 15.0, 15.0);
-    ScopedFPDFBitmap bitmap4 = RenderLoadedPage(page);
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 15.0, 15.0);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 15.0, 15.0);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 15.0, 15.0);
+    ScopedFPDFBitmap bitmap4 = RenderLoadedPage(page.get());
     CompareBitmap(bitmap4.get(), 300, 300,
                   unfocused_text_form_with_abc_checksum);
 
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
-
-    // Close page
-    UnloadPage(page);
   }
   // Check saved document
   VerifySavedDocument(300, 300, unfocused_text_form_with_abc_checksum);
@@ -1421,18 +1377,16 @@
   }();
 
   ASSERT_TRUE(OpenDocument("bug_890322.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap_normal = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap_normal = RenderLoadedPage(page.get());
   CompareBitmap(bitmap_normal.get(), 200, 200, pdfium::Bug890322Checksum());
 
   ScopedFPDFBitmap bitmap_reverse_byte_order =
-      RenderLoadedPageWithFlags(page, FPDF_REVERSE_BYTE_ORDER);
+      RenderLoadedPageWithFlags(page.get(), FPDF_REVERSE_BYTE_ORDER);
   CompareBitmap(bitmap_reverse_byte_order.get(), 200, 200,
                 reverse_byte_order_checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, Bug1302455RenderOnly) {
@@ -1444,15 +1398,14 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("bug_1302455.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 300, 300, checksum);
 
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-    UnloadPage(page);
   }
   VerifySavedDocument(300, 300, checksum);
 }
@@ -1476,23 +1429,23 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("bug_1302455.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
-              FPDFPage_HasFormFieldAtPoint(form_handle(), page, 110, 110));
-    FORM_OnMouseMove(form_handle(), page, 0, 110, 110);
-    FORM_OnLButtonDown(form_handle(), page, 0, 110, 110);
-    FORM_OnLButtonUp(form_handle(), page, 0, 110, 110);
-    FORM_OnChar(form_handle(), page, 'A', 0);
+    EXPECT_EQ(
+        FPDF_FORMFIELD_TEXTFIELD,
+        FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 110, 110));
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnChar(form_handle(), page.get(), 'A', 0);
 
     FORM_ForceToKillFocus(form_handle());
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 300, 300, checksum);
 
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-    UnloadPage(page);
   }
   VerifySavedDocument(300, 300, checksum);
 }
@@ -1516,23 +1469,23 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("bug_1302455.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
-              FPDFPage_HasFormFieldAtPoint(form_handle(), page, 110, 170));
-    FORM_OnMouseMove(form_handle(), page, 0, 110, 170);
-    FORM_OnLButtonDown(form_handle(), page, 0, 110, 170);
-    FORM_OnLButtonUp(form_handle(), page, 0, 110, 170);
-    FORM_OnChar(form_handle(), page, 'B', 0);
+    EXPECT_EQ(
+        FPDF_FORMFIELD_TEXTFIELD,
+        FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 110, 170));
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnChar(form_handle(), page.get(), 'B', 0);
 
     FORM_ForceToKillFocus(form_handle());
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 300, 300, checksum);
 
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-    UnloadPage(page);
   }
   VerifySavedDocument(300, 300, checksum);
 }
@@ -1556,30 +1509,31 @@
   }();
   {
     ASSERT_TRUE(OpenDocument("bug_1302455.pdf"));
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
-              FPDFPage_HasFormFieldAtPoint(form_handle(), page, 110, 110));
-    FORM_OnMouseMove(form_handle(), page, 0, 110, 110);
-    FORM_OnLButtonDown(form_handle(), page, 0, 110, 110);
-    FORM_OnLButtonUp(form_handle(), page, 0, 110, 110);
-    FORM_OnChar(form_handle(), page, 'A', 0);
+    EXPECT_EQ(
+        FPDF_FORMFIELD_TEXTFIELD,
+        FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 110, 110));
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 110, 110);
+    FORM_OnChar(form_handle(), page.get(), 'A', 0);
 
-    EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
-              FPDFPage_HasFormFieldAtPoint(form_handle(), page, 110, 170));
-    FORM_OnMouseMove(form_handle(), page, 0, 110, 170);
-    FORM_OnLButtonDown(form_handle(), page, 0, 110, 170);
-    FORM_OnLButtonUp(form_handle(), page, 0, 110, 170);
-    FORM_OnChar(form_handle(), page, 'B', 0);
+    EXPECT_EQ(
+        FPDF_FORMFIELD_TEXTFIELD,
+        FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 110, 170));
+    FORM_OnMouseMove(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnLButtonDown(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnLButtonUp(form_handle(), page.get(), 0, 110, 170);
+    FORM_OnChar(form_handle(), page.get(), 'B', 0);
 
     FORM_ForceToKillFocus(form_handle());
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 300, 300, checksum);
 
     EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
 
-    UnloadPage(page);
   }
   VerifySavedDocument(300, 300, checksum);
 }
@@ -1603,22 +1557,20 @@
   }();
 
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page.get());
   CompareBitmap(bitmap1.get(), 300, 300, TextFormChecksum());
 
   // Removing the highlight changes the rendering.
   FPDF_RemoveFormFieldHighlight(form_handle());
-  ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page.get());
   CompareBitmap(bitmap2.get(), 300, 300, no_highlight_checksum);
 
   // Restoring it gives the original rendering.
   SetInitialFormFieldHighlight(form_handle());
-  ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page.get());
   CompareBitmap(bitmap3.get(), 300, 300, TextFormChecksum());
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillEmbedderTest, HasFormInfoNone) {
@@ -1643,53 +1595,48 @@
 
 TEST_F(FPDFFormFillEmbedderTest, BadApiInputsText) {
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   EXPECT_FALSE(FORM_SetIndexSelected(nullptr, nullptr, 0, true));
-  EXPECT_FALSE(FORM_SetIndexSelected(nullptr, page, 0, true));
+  EXPECT_FALSE(FORM_SetIndexSelected(nullptr, page.get(), 0, true));
   EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), nullptr, 0, true));
-  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page, -1, true));
+  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page.get(), -1, true));
   EXPECT_FALSE(FORM_IsIndexSelected(nullptr, nullptr, 0));
-  EXPECT_FALSE(FORM_IsIndexSelected(nullptr, page, 0));
+  EXPECT_FALSE(FORM_IsIndexSelected(nullptr, page.get(), 0));
   EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), nullptr, 0));
-  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page, -1));
-
-  UnloadPage(page);
+  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page.get(), -1));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, BadApiInputsComboBox) {
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page, -1, true));
-  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page, 100, true));
-  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page, -1));
-  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page, 100));
-
-  UnloadPage(page);
+  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page.get(), -1, true));
+  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page.get(), 100, true));
+  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page.get(), -1));
+  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page.get(), 100));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, BadApiInputsListBox) {
   ASSERT_TRUE(OpenDocument("listbox_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page, -1, true));
-  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page, 100, true));
-  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page, -1));
-  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page, 100));
-
-  UnloadPage(page);
+  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page.get(), -1, true));
+  EXPECT_FALSE(FORM_SetIndexSelected(form_handle(), page.get(), 100, true));
+  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page.get(), -1));
+  EXPECT_FALSE(FORM_IsIndexSelected(form_handle(), page.get(), 100));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, HasFormFieldAtPointForXFADoc) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_EQ(-1, FPDFPage_HasFormFieldAtPoint(form_handle(), page, 612, 792));
+  EXPECT_EQ(-1,
+            FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 612, 792));
 
 #ifdef PDF_ENABLE_XFA
   constexpr int kExpectedFieldType = FPDF_FORMFIELD_XFA_TEXTFIELD;
@@ -1697,47 +1644,43 @@
   constexpr int kExpectedFieldType = -1;
 #endif
   EXPECT_EQ(kExpectedFieldType,
-            FPDFPage_HasFormFieldAtPoint(form_handle(), page, 50, 30));
-
-  UnloadPage(page);
+            FPDFPage_HasFormFieldAtPoint(form_handle(), page.get(), 50, 30));
 }
 
 TEST_F(FPDFFormFillEmbedderTest, SelectAllText) {
   ASSERT_TRUE(OpenDocument("text_form.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Test bad arguments.
   EXPECT_FALSE(FORM_SelectAllText(nullptr, nullptr));
   EXPECT_FALSE(FORM_SelectAllText(form_handle(), nullptr));
-  EXPECT_FALSE(FORM_SelectAllText(nullptr, page));
+  EXPECT_FALSE(FORM_SelectAllText(nullptr, page.get()));
 
   // Focus on the text field and add some text.
-  EXPECT_TRUE(FORM_OnFocus(form_handle(), page, 0, 115, 115));
+  EXPECT_TRUE(FORM_OnFocus(form_handle(), page.get(), 0, 115, 115));
   ScopedFPDFWideString text_to_insert = GetFPDFWideString(L"Hello");
-  FORM_ReplaceSelection(form_handle(), page, text_to_insert.get());
+  FORM_ReplaceSelection(form_handle(), page.get(), text_to_insert.get());
 
   // Sanity check text field data.
   uint16_t buffer[6];
-  ASSERT_EQ(12u, FORM_GetFocusedText(form_handle(), page, nullptr, 0));
-  ASSERT_EQ(12u,
-            FORM_GetFocusedText(form_handle(), page, buffer, sizeof(buffer)));
+  ASSERT_EQ(12u, FORM_GetFocusedText(form_handle(), page.get(), nullptr, 0));
+  ASSERT_EQ(12u, FORM_GetFocusedText(form_handle(), page.get(), buffer,
+                                     sizeof(buffer)));
   EXPECT_EQ("Hello", GetPlatformString(buffer));
 
   // Check there is no selection.
-  ASSERT_EQ(2u, FORM_GetSelectedText(form_handle(), page, nullptr, 0));
-  ASSERT_EQ(2u,
-            FORM_GetSelectedText(form_handle(), page, buffer, sizeof(buffer)));
+  ASSERT_EQ(2u, FORM_GetSelectedText(form_handle(), page.get(), nullptr, 0));
+  ASSERT_EQ(2u, FORM_GetSelectedText(form_handle(), page.get(), buffer,
+                                     sizeof(buffer)));
   EXPECT_EQ("", GetPlatformString(buffer));
 
   // Check FORM_SelectAllText() works.
-  EXPECT_TRUE(FORM_SelectAllText(form_handle(), page));
-  ASSERT_EQ(12u, FORM_GetSelectedText(form_handle(), page, nullptr, 0));
-  ASSERT_EQ(12u,
-            FORM_GetSelectedText(form_handle(), page, buffer, sizeof(buffer)));
+  EXPECT_TRUE(FORM_SelectAllText(form_handle(), page.get()));
+  ASSERT_EQ(12u, FORM_GetSelectedText(form_handle(), page.get(), nullptr, 0));
+  ASSERT_EQ(12u, FORM_GetSelectedText(form_handle(), page.get(), buffer,
+                                      sizeof(buffer)));
   EXPECT_EQ("Hello", GetPlatformString(buffer));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFFormFillTextFormEmbedderTest, GetSelectedTextEmptyAndBasicKeyboard) {
diff --git a/fpdfsdk/fpdf_ppo_embeddertest.cpp b/fpdfsdk/fpdf_ppo_embeddertest.cpp
index 6a77d5a..0ab907b 100644
--- a/fpdfsdk/fpdf_ppo_embeddertest.cpp
+++ b/fpdfsdk/fpdf_ppo_embeddertest.cpp
@@ -91,7 +91,7 @@
 TEST_F(FPDFPPOEmbedderTest, ImportPagesByIndex) {
   ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -102,14 +102,12 @@
   EXPECT_TRUE(FPDF_ImportPagesByIndex(
       output_doc.get(), document(), kPageIndices, std::size(kPageIndices), 0));
   EXPECT_EQ(1, FPDF_GetPageCount(output_doc.get()));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, ImportPages) {
   ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -117,8 +115,6 @@
   EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc.get(), document()));
   EXPECT_TRUE(FPDF_ImportPages(output_doc.get(), document(), "1", 0));
   EXPECT_EQ(1, FPDF_GetPageCount(output_doc.get()));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, ImportNPages) {
@@ -294,11 +290,11 @@
   FPDF_XOBJECT xobject = FPDF_NewXObjectFromPage(document(), document(), 0);
   ASSERT_TRUE(xobject);
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 200, 300, pdfium::RectanglesChecksum());
   }
 
@@ -309,11 +305,11 @@
   static constexpr FS_MATRIX kMatrix = {0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f};
   EXPECT_TRUE(FPDFPageObj_SetMatrix(page_object, &kMatrix));
 
-  FPDFPage_InsertObject(page, page_object);
-  EXPECT_TRUE(FPDFPage_GenerateContent(page));
+  FPDFPage_InsertObject(page.get(), page_object);
+  EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
 
   {
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 200, 300, checksum);
   }
 
@@ -321,8 +317,6 @@
 
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
   VerifySavedDocument(200, 300, checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, XObjectNullParams) {
@@ -370,10 +364,9 @@
   // Show all pages render the same.
   ASSERT_EQ(kPageCount, FPDF_GetPageCount(document()));
   for (int i = 0; i < kPageCount; ++i) {
-    FPDF_PAGE page = LoadPage(0);
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 792, 612, kRectsChecksum);
-    UnloadPage(page);
   }
 
   // Create a 2-up PDF.
@@ -458,7 +451,7 @@
 TEST_F(FPDFPPOEmbedderTest, BadIndices) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -479,14 +472,12 @@
   static constexpr int kBadIndices4[] = {42};
   EXPECT_FALSE(FPDF_ImportPagesByIndex(
       output_doc.get(), document(), kBadIndices4, std::size(kBadIndices4), 0));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, GoodIndices) {
   ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -520,14 +511,12 @@
   EXPECT_TRUE(
       FPDF_ImportPagesByIndex(output_doc.get(), document(), nullptr, 0, 0));
   EXPECT_EQ(14, FPDF_GetPageCount(output_doc.get()));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, BadRanges) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -542,14 +531,12 @@
   EXPECT_FALSE(FPDF_ImportPages(output_doc.get(), document(), "1-", 0));
   EXPECT_FALSE(FPDF_ImportPages(output_doc.get(), document(), "-1", 0));
   EXPECT_FALSE(FPDF_ImportPages(output_doc.get(), document(), "-,0,,,1-", 0));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, GoodRanges) {
   ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -563,15 +550,13 @@
   EXPECT_EQ(6, FPDF_GetPageCount(output_doc.get()));
   EXPECT_TRUE(FPDF_ImportPages(output_doc.get(), document(), "2-4", 0));
   EXPECT_EQ(9, FPDF_GetPageCount(output_doc.get()));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, Bug664284) {
   ASSERT_TRUE(OpenDocument("bug_664284.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
-  ASSERT_NE(nullptr, page);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_NE(nullptr, page.get());
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
   EXPECT_TRUE(output_doc);
@@ -579,8 +564,6 @@
   static constexpr int kIndices[] = {0};
   EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc.get(), document(), kIndices,
                                       std::size(kIndices), 0));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFPPOEmbedderTest, Bug750568) {
@@ -588,12 +571,11 @@
   ASSERT_EQ(4, FPDF_GetPageCount(document()));
 
   for (size_t i = 0; i < 4; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     ASSERT_TRUE(page);
 
-    ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+    ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
     CompareBitmap(bitmap.get(), 200, 200, Bug750568PageHash(i));
-    UnloadPage(page);
   }
 
   ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
@@ -614,12 +596,11 @@
 
 TEST_F(FPDFPPOEmbedderTest, ImportWithZeroLengthStream) {
   ASSERT_TRUE(OpenDocument("zero_length_stream.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), 200, 200, pdfium::HelloWorldChecksum());
-  UnloadPage(page);
 
   ScopedFPDFDocument new_doc(FPDF_CreateNewDocument());
   ASSERT_TRUE(new_doc);
@@ -686,18 +667,16 @@
   }();
   const char new_page_2_checksum[] = "39336760026e7f3d26135e3b765125c3";
   {
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderPage(page);
+    ScopedFPDFBitmap bitmap = RenderPage(page.get());
     CompareBitmap(bitmap.get(), 200, 300, new_page_1_checksum);
-    UnloadPage(page);
   }
   {
-    FPDF_PAGE page = LoadPage(1);
+    ScopedEmbedderTestPage page = LoadScopedPage(1);
     ASSERT_TRUE(page);
-    ScopedFPDFBitmap bitmap = RenderPage(page);
+    ScopedFPDFBitmap bitmap = RenderPage(page.get());
     CompareBitmap(bitmap.get(), 200, 100, new_page_2_checksum);
-    UnloadPage(page);
   }
 
   EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
diff --git a/fpdfsdk/fpdf_searchex_embeddertest.cpp b/fpdfsdk/fpdf_searchex_embeddertest.cpp
index 5740789..8562d69 100644
--- a/fpdfsdk/fpdf_searchex_embeddertest.cpp
+++ b/fpdfsdk/fpdf_searchex_embeddertest.cpp
@@ -10,11 +10,11 @@
 
 TEST_F(FPDFSearchExEmbedderTest, GetCharIndexFromTextIndex) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(textpage);
 
     EXPECT_EQ(-2, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -2));
@@ -27,18 +27,16 @@
     EXPECT_EQ(29, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 29));
     EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 30));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSearchExEmbedderTest,
        GetCharIndexFromTextIndexWithNonPrintableChar) {
   ASSERT_TRUE(OpenDocument("bug_1139.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(textpage);
 
     EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -2));
@@ -52,8 +50,6 @@
     EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 30));
     EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 31));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSearchExEmbedderTest, GetCharIndexFromTextIndexInvalid) {
@@ -66,11 +62,11 @@
 
 TEST_F(FPDFSearchExEmbedderTest, GetTextIndexFromCharIndex) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(textpage);
 
     EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -2));
@@ -83,18 +79,16 @@
     EXPECT_EQ(29, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 29));
     EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 30));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSearchExEmbedderTest,
        GetTextIndexFromCharIndexWithNonPrintableChar) {
   ASSERT_TRUE(OpenDocument("bug_1139.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page.get()));
     ASSERT_TRUE(textpage);
 
     EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -2));
@@ -108,8 +102,6 @@
     EXPECT_EQ(29, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 30));
     EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 31));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSearchExEmbedderTest, GetTextIndexFromCharIndexInvalid) {
diff --git a/fpdfsdk/fpdf_structtree_embeddertest.cpp b/fpdfsdk/fpdf_structtree_embeddertest.cpp
index f5a8b0f..b455bde 100644
--- a/fpdfsdk/fpdf_structtree_embeddertest.cpp
+++ b/fpdfsdk/fpdf_structtree_embeddertest.cpp
@@ -16,11 +16,11 @@
 
 TEST_F(FPDFStructTreeEmbedderTest, GetAltText) {
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -73,17 +73,15 @@
         FPDF_StructElement_GetChildAtIndex(gchild_element, 0);
     EXPECT_FALSE(ggchild_element);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetActualText) {
   ASSERT_TRUE(OpenDocument("tagged_actual_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -118,17 +116,15 @@
                                                     sizeof(buffer)));
     EXPECT_EQ(L"Actual Text", GetPlatformWString(buffer));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetStringAttribute) {
   ASSERT_TRUE(OpenDocument("tagged_table.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -181,17 +177,15 @@
     EXPECT_EQ(0U, FPDF_StructElement_GetStringAttribute(nullptr, "Other",
                                                         buffer, kBufLen));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetStringAttributeBadStructElement) {
   ASSERT_TRUE(OpenDocument("tagged_table_bad_elem.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -221,17 +215,15 @@
     FPDF_STRUCTELEMENT row = FPDF_StructElement_GetChildAtIndex(table, 0);
     EXPECT_TRUE(row);
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetID) {
   ASSERT_TRUE(OpenDocument("tagged_table.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -266,17 +258,15 @@
     ASSERT_TRUE(row);
     EXPECT_EQ(2U, FPDF_StructElement_GetID(row, buffer, kBufLen));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetLang) {
   ASSERT_TRUE(OpenDocument("tagged_table.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -314,19 +304,17 @@
     ASSERT_TRUE(row);
     EXPECT_EQ(0U, FPDF_StructElement_GetLang(row, buffer, kBufLen));
   }
-
-  UnloadPage(page);
 }
 
 // See also FPDFEditEmbedderTest.TraverseMarkedContentID, which traverses the
 // marked contents using FPDFPageObj_GetMark() and related API.
 TEST_F(FPDFStructTreeEmbedderTest, GetMarkedContentID) {
   ASSERT_TRUE(OpenDocument("marked_content_id.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -334,17 +322,15 @@
         FPDF_StructTree_GetChildAtIndex(struct_tree.get(), 0);
     EXPECT_EQ(0, FPDF_StructElement_GetMarkedContentID(element));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetMarkedContentIdAtIndex) {
   ASSERT_TRUE(OpenDocument("tagged_marked_content.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(4, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -388,8 +374,6 @@
     EXPECT_EQ(-1, FPDF_StructElement_GetMarkedContentIdCount(child4));
     EXPECT_EQ(-1, FPDF_StructElement_GetMarkedContentIdAtIndex(child4, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetChildMarkedContentID) {
@@ -397,9 +381,9 @@
 
   // Using the loop to make difference clear
   for (int page_i : {0, 1}) {
-    FPDF_PAGE page = LoadPage(page_i);
+    ScopedEmbedderTestPage page = LoadScopedPage(page_i);
     ASSERT_TRUE(page);
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -435,17 +419,16 @@
     EXPECT_EQ(-1, FPDF_StructElement_GetChildMarkedContentID(struct_doc, 2));
     // Invalid element
     EXPECT_EQ(-1, FPDF_StructElement_GetChildMarkedContentID(nullptr, 0));
-    UnloadPage(page);
   }
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetType) {
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -469,17 +452,15 @@
     ASSERT_EQ(18U, FPDF_StructElement_GetType(element, buffer, sizeof(buffer)));
     EXPECT_EQ(L"Document", GetPlatformWString(buffer));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetObjType) {
   ASSERT_TRUE(OpenDocument("tagged_table_bad_elem.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -522,17 +503,15 @@
     // Reading bad elem also works.
     EXPECT_EQ(L"NotStructElem", GetPlatformWString(buffer));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetParent) {
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -554,17 +533,15 @@
     // We currently handle this case by returning a nullptr.
     ASSERT_EQ(nullptr, FPDF_StructElement_GetParent(parent));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetTitle) {
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -599,17 +576,15 @@
                                                sizeof(buffer)));
     EXPECT_EQ(L"symbol: 100k", GetPlatformWString(buffer));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetAttributes) {
   ASSERT_TRUE(OpenDocument("tagged_table.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -786,17 +761,15 @@
       }
     }
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetAttributesFromChildAttributes) {
   ASSERT_TRUE(OpenDocument("tagged_actual_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -870,30 +843,27 @@
     EXPECT_EQ(FPDF_OBJECT_NUMBER,
               FPDF_StructElement_Attr_GetType(nested_attr_value3));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, GetStructTreeForNestedTaggedPDF) {
   ASSERT_TRUE(OpenDocument("tagged_nested.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // This call should not crash. https://crbug.com/pdfium/1480
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
   }
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, MarkedContentReferenceAndObjectReference) {
   ASSERT_TRUE(OpenDocument("tagged_mcr_objr.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -969,17 +939,15 @@
     // TODO(crbug.com/pdfium/672): Fetch this child element.
     EXPECT_FALSE(FPDF_StructElement_GetChildAtIndex(object15, 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, Bug1768) {
   ASSERT_TRUE(OpenDocument("bug_1768.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
@@ -988,37 +956,31 @@
     // fetched correctly as well.
     EXPECT_FALSE(FPDF_StructTree_GetChildAtIndex(struct_tree.get(), 0));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, Bug1296920) {
   ASSERT_TRUE(OpenDocument("bug_1296920.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
 
     // Destroying this tree should not crash.
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFStructTreeEmbedderTest, Bug1443100) {
   ASSERT_TRUE(OpenDocument("tagged_table_bad_parent.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Calling these APIs should not trigger a dangling pointer.
-    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page));
+    ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page.get()));
     ASSERT_TRUE(struct_tree);
     ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get()));
   }
-
-  UnloadPage(page);
 }
diff --git a/fpdfsdk/fpdf_sysfontinfo_embeddertest.cpp b/fpdfsdk/fpdf_sysfontinfo_embeddertest.cpp
index 9751bfb..6f0a1aa 100644
--- a/fpdfsdk/fpdf_sysfontinfo_embeddertest.cpp
+++ b/fpdfsdk/fpdf_sysfontinfo_embeddertest.cpp
@@ -127,26 +127,23 @@
   ASSERT_TRUE(OpenDocument("bug_972518.pdf"));
   ASSERT_EQ(1, FPDF_GetPageCount(document()));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSysFontInfoEmbedderTest, DefaultSystemFontInfo) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
   ASSERT_EQ(1, FPDF_GetPageCount(document()));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   {
     // Not checking the rendering because it will depend on the fonts installed.
-    ScopedFPDFBitmap bitmap = RenderPage(page);
+    ScopedFPDFBitmap bitmap = RenderPage(page.get());
     ASSERT_EQ(200, FPDFBitmap_GetWidth(bitmap.get()));
     ASSERT_EQ(200, FPDFBitmap_GetHeight(bitmap.get()));
   }
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFSysFontInfoEmbedderTest, DefaultTTFMap) {
diff --git a/fpdfsdk/fpdf_text_embeddertest.cpp b/fpdfsdk/fpdf_text_embeddertest.cpp
index 2b0c7da..d17c0c8 100644
--- a/fpdfsdk/fpdf_text_embeddertest.cpp
+++ b/fpdfsdk/fpdf_text_embeddertest.cpp
@@ -49,10 +49,10 @@
 
 TEST_F(FPDFTextEmbedderTest, Text) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   unsigned short buffer[128];
@@ -232,15 +232,14 @@
   EXPECT_EQ(0xbdbd, buffer[10]);
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, TextVertical) {
   ASSERT_TRUE(OpenDocument("vertical_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   EXPECT_EQ(12.0, FPDFText_GetFontSize(textpage, 0));
@@ -269,7 +268,6 @@
   EXPECT_NEAR(159.292, rect.top, 0.001);
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, TextHebrewMirrored) {
@@ -301,10 +299,10 @@
 
 TEST_F(FPDFTextEmbedderTest, TextSearch) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   ScopedFPDFWideString nope = GetFPDFWideString(L"nope");
@@ -412,15 +410,14 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, TextSearchConsecutive) {
   ASSERT_TRUE(OpenDocument("find_text_consecutive.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   ScopedFPDFWideString aaaa = GetFPDFWideString(L"aaaa");
@@ -496,7 +493,6 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, TextSearchTermAtEnd) {
@@ -600,10 +596,10 @@
 #endif
 TEST_F(FPDFTextEmbedderTest, MAYBE_TextSearchLatinExtended) {
   ASSERT_TRUE(OpenDocument("latin_extended.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   // Upper/lowercase 'a' with breve.
@@ -628,29 +624,27 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 // Test that the page has characters despite a bad stream length.
 TEST_F(FPDFTextEmbedderTest, StreamLengthPastEndOfFile) {
   ASSERT_TRUE(OpenDocument("bug_57.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
   EXPECT_EQ(13, FPDFText_CountChars(textpage));
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, WebLinks) {
   ASSERT_TRUE(OpenDocument("weblinks.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   {
@@ -753,15 +747,14 @@
 
   FPDFLink_CloseWebLinks(pagelink);
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, WebLinksAcrossLines) {
   ASSERT_TRUE(OpenDocument("weblinks_across_lines.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage);
@@ -792,15 +785,14 @@
 
   FPDFLink_CloseWebLinks(pagelink);
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, WebLinksAcrossLinesBug) {
   ASSERT_TRUE(OpenDocument("bug_650.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage);
@@ -818,15 +810,14 @@
 
   FPDFLink_CloseWebLinks(pagelink);
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, WebLinksCharRanges) {
   ASSERT_TRUE(OpenDocument("weblinks.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   FPDF_PAGELINK page_link = FPDFLink_LoadWebLinks(text_page);
@@ -866,20 +857,19 @@
 
   FPDFLink_CloseWebLinks(page_link);
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, AnnotLinks) {
   ASSERT_TRUE(OpenDocument("annots.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get link count via checking annotation subtype
-  int annot_count = FPDFPage_GetAnnotCount(page);
+  int annot_count = FPDFPage_GetAnnotCount(page.get());
   ASSERT_EQ(9, annot_count);
   int annot_subtype_link_count = 0;
   for (int i = 0; i < annot_count; ++i) {
-    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, i));
+    ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), i));
     if (FPDFAnnot_GetSubtype(annot.get()) == FPDF_ANNOT_LINK) {
       ++annot_subtype_link_count;
     }
@@ -890,7 +880,7 @@
   int start_pos = 0;
   FPDF_LINK link_annot;
   int link_count = 0;
-  while (FPDFLink_Enumerate(page, &start_pos, &link_annot)) {
+  while (FPDFLink_Enumerate(page.get(), &start_pos, &link_annot)) {
     ASSERT_TRUE(link_annot);
     if (start_pos == 1 || start_pos == 2) {
       // First two links point to first and second page within the document
@@ -930,16 +920,14 @@
     ++link_count;
   }
   EXPECT_EQ(annot_subtype_link_count, link_count);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetFontSize) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   constexpr auto kExpectedFontsSizes = fxcrt::ToArray<const double>(
@@ -952,15 +940,14 @@
     EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i;
   }
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetFontInfo) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
   std::vector<char> font_name;
   size_t num_chars1 = strlen("Hello, world!");
@@ -1034,22 +1021,20 @@
                                      font_name.size(), nullptr));
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, ToUnicode) {
   ASSERT_TRUE(OpenDocument("bug_583.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   ASSERT_EQ(1, FPDFText_CountChars(textpage));
   EXPECT_EQ(0U, FPDFText_GetUnicode(textpage, 0));
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, IsGenerated) {
@@ -1134,10 +1119,10 @@
 
 TEST_F(FPDFTextEmbedderTest, Bug921) {
   ASSERT_TRUE(OpenDocument("bug_921.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   static constexpr auto kData = fxcrt::ToArray<const unsigned int>(
@@ -1161,15 +1146,14 @@
   EXPECT_EQ(0, buffer[kData.size()]);
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetTextWithHyphen) {
   ASSERT_TRUE(OpenDocument("bug_781804.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   // Check that soft hyphens are not included
@@ -1206,26 +1190,24 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, Bug782596) {
   // If there is a regression in this test, it will only fail under ASAN
   ASSERT_TRUE(OpenDocument("bug_782596.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, ControlCharacters) {
   ASSERT_TRUE(OpenDocument("control_characters.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   // Should not include the control characters in the output
@@ -1250,17 +1232,16 @@
                                     sizeof(expected_substring)));
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 // Testing that hyphen makers (0x0002) are replacing hard hyphens when
 // the word contains non-ASCII characters.
 TEST_F(FPDFTextEmbedderTest, Bug1029) {
   ASSERT_TRUE(OpenDocument("bug_1029.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   constexpr int page_range_offset = 171;
@@ -1293,15 +1274,14 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, CountRects) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(textpage);
 
   // Sanity check hello_world.pdf.
@@ -1365,19 +1345,18 @@
   }
 
   FPDFText_ClosePage(textpage);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetText) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
-  EXPECT_EQ(2, FPDFPage_CountObjects(page));
-  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page, 0);
+  EXPECT_EQ(2, FPDFPage_CountObjects(page.get()));
+  FPDF_PAGEOBJECT text_object = FPDFPage_GetObject(page.get(), 0);
   ASSERT_TRUE(text_object);
 
   // Positive testing.
@@ -1409,7 +1388,6 @@
   ASSERT_EQ('\0', buffer[1]);
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, CroppedText) {
@@ -1467,10 +1445,10 @@
 
 TEST_F(FPDFTextEmbedderTest, Bug1139) {
   ASSERT_TRUE(OpenDocument("bug_1139.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   // -1 for CountChars not including the \0, but +1 for the extra control
@@ -1485,7 +1463,6 @@
   EXPECT_TRUE(
       check_unsigned_shorts(kHelloGoodbyeText, buffer, kHelloGoodbyeTextSize));
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, Bug642) {
@@ -1511,10 +1488,10 @@
 
 TEST_F(FPDFTextEmbedderTest, GetCharAngle) {
   ASSERT_TRUE(OpenDocument("rotated_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   static constexpr int kSubstringsSize[] = {
@@ -1544,15 +1521,14 @@
       0.001);
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetFontWeight) {
   ASSERT_TRUE(OpenDocument("font_weight.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   EXPECT_EQ(2, FPDFText_CountChars(text_page));
@@ -1571,7 +1547,6 @@
   EXPECT_EQ(410, FPDFText_GetFontWeight(text_page, 1));
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetTextRenderMode) {
@@ -1603,10 +1578,10 @@
 
 TEST_F(FPDFTextEmbedderTest, GetFillColor) {
   ASSERT_TRUE(OpenDocument("text_color.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   ASSERT_EQ(1, FPDFText_CountChars(text_page));
@@ -1631,15 +1606,14 @@
   ASSERT_EQ(0xffu, a);
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetStrokeColor) {
   ASSERT_TRUE(OpenDocument("text_color.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
+  FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page.get());
   ASSERT_TRUE(text_page);
 
   ASSERT_EQ(1, FPDFText_CountChars(text_page));
@@ -1664,7 +1638,6 @@
   ASSERT_EQ(0xffu, a);
 
   FPDFText_ClosePage(text_page);
-  UnloadPage(page);
 }
 
 TEST_F(FPDFTextEmbedderTest, GetMatrix) {
diff --git a/fpdfsdk/fpdf_thumbnail_embeddertest.cpp b/fpdfsdk/fpdf_thumbnail_embeddertest.cpp
index 023e8ba..8566b5f 100644
--- a/fpdfsdk/fpdf_thumbnail_embeddertest.cpp
+++ b/fpdfsdk/fpdf_thumbnail_embeddertest.cpp
@@ -26,38 +26,36 @@
     const char kHashedDecodedData[] = "7902d0be831c9024960f4ebd5d7df1f7";
     const unsigned long kExpectedSize = 1138u;
 
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
     unsigned long length_bytes =
-        FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
+        FPDFPage_GetDecodedThumbnailData(page.get(), nullptr, 0);
     ASSERT_EQ(kExpectedSize, length_bytes);
     std::vector<uint8_t> thumb_buf(length_bytes);
 
     EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
-                                 page, thumb_buf.data(), length_bytes));
+                                 page.get(), thumb_buf.data(), length_bytes));
     EXPECT_EQ(kHashedDecodedData, GenerateMD5Base16(thumb_buf));
 
-    UnloadPage(page);
   }
 
   {
     const char kHashedDecodedData[] = "e81123a573378ba1ea80461d25cc41f6";
     const unsigned long kExpectedSize = 1110u;
 
-    FPDF_PAGE page = LoadPage(1);
+    ScopedEmbedderTestPage page = LoadScopedPage(1);
     ASSERT_TRUE(page);
 
     unsigned long length_bytes =
-        FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
+        FPDFPage_GetDecodedThumbnailData(page.get(), nullptr, 0);
     ASSERT_EQ(kExpectedSize, length_bytes);
     std::vector<uint8_t> thumb_buf(length_bytes);
 
     EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
-                                 page, thumb_buf.data(), length_bytes));
+                                 page.get(), thumb_buf.data(), length_bytes));
     EXPECT_EQ(kHashedDecodedData, GenerateMD5Base16(thumb_buf));
 
-    UnloadPage(page);
   }
 }
 
@@ -67,31 +65,27 @@
 
   const unsigned long kExpectedSize = 301u;
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   unsigned long length_bytes =
-      FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
+      FPDFPage_GetDecodedThumbnailData(page.get(), nullptr, 0);
   ASSERT_EQ(kExpectedSize, length_bytes);
   std::vector<uint8_t> thumb_buf(length_bytes);
 
   EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
-                               page, thumb_buf.data(), length_bytes));
+                               page.get(), thumb_buf.data(), length_bytes));
   EXPECT_EQ(kThumbnailWithNoFiltersChecksum, GenerateMD5Base16(thumb_buf));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest,
        GetDecodedThumbnailDataFromPageWithNoThumbnails) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_EQ(0u, FPDFPage_GetDecodedThumbnailData(page, nullptr, 0));
-
-  UnloadPage(page);
+  EXPECT_EQ(0u, FPDFPage_GetDecodedThumbnailData(page.get(), nullptr, 0));
 }
 
 TEST_F(FPDFThumbnailEmbedderTest, GetDecodedThumbnailDataFromPageNullPage) {
@@ -104,36 +98,36 @@
   {
     const unsigned long kExpectedSize = 1851u;
 
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
+    unsigned long length_bytes =
+        FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0);
     ASSERT_EQ(kExpectedSize, length_bytes);
     std::vector<uint8_t> thumb_buf(length_bytes);
 
     EXPECT_EQ(kExpectedSize, FPDFPage_GetRawThumbnailData(
-                                 page, thumb_buf.data(), length_bytes));
+                                 page.get(), thumb_buf.data(), length_bytes));
     EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(thumb_buf));
 
-    UnloadPage(page);
   }
 
   {
     const char kHashedRawData[] = "c7558a461d5ecfb1d4757218b473afc0";
     const unsigned long kExpectedSize = 1792u;
 
-    FPDF_PAGE page = LoadPage(1);
+    ScopedEmbedderTestPage page = LoadScopedPage(1);
     ASSERT_TRUE(page);
 
-    unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
+    unsigned long length_bytes =
+        FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0);
     ASSERT_EQ(kExpectedSize, length_bytes);
     std::vector<uint8_t> thumb_buf(length_bytes);
 
     EXPECT_EQ(kExpectedSize, FPDFPage_GetRawThumbnailData(
-                                 page, thumb_buf.data(), length_bytes));
+                                 page.get(), thumb_buf.data(), length_bytes));
     EXPECT_EQ(kHashedRawData, GenerateMD5Base16(thumb_buf));
 
-    UnloadPage(page);
   }
 }
 
@@ -142,29 +136,26 @@
 
   const unsigned long kExpectedSize = 301u;
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
+  unsigned long length_bytes =
+      FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0);
   ASSERT_EQ(kExpectedSize, length_bytes);
   std::vector<uint8_t> thumb_buf(length_bytes);
 
-  EXPECT_EQ(kExpectedSize,
-            FPDFPage_GetRawThumbnailData(page, thumb_buf.data(), length_bytes));
+  EXPECT_EQ(kExpectedSize, FPDFPage_GetRawThumbnailData(
+                               page.get(), thumb_buf.data(), length_bytes));
   EXPECT_EQ(kThumbnailWithNoFiltersChecksum, GenerateMD5Base16(thumb_buf));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageWithNoThumbnails) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  EXPECT_EQ(0u, FPDFPage_GetRawThumbnailData(page, nullptr, 0));
-
-  UnloadPage(page);
+  EXPECT_EQ(0u, FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0));
 }
 
 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageNullPage) {
@@ -175,10 +166,10 @@
   ASSERT_TRUE(OpenDocument("simple_thumbnail.pdf"));
 
   {
-    FPDF_PAGE page = LoadPage(0);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
     ASSERT_TRUE(page);
 
-    ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+    ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
 
     EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
     EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
@@ -186,14 +177,13 @@
     CompareBitmap(thumb_bitmap.get(), 50, 50,
                   "52b75451e396f55e95d1cb68e6018226");
 
-    UnloadPage(page);
   }
 
   {
-    FPDF_PAGE page = LoadPage(1);
+    ScopedEmbedderTestPage page = LoadScopedPage(1);
     ASSERT_TRUE(page);
 
-    ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+    ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
 
     EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
     EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
@@ -201,7 +191,6 @@
     CompareBitmap(thumb_bitmap.get(), 50, 50,
                   "1f448be08c6e6043ccd0bad8ecc2a351");
 
-    UnloadPage(page);
   }
 }
 
@@ -209,43 +198,37 @@
        GetThumbnailAsBitmapFromPageWithoutThumbnail) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
   ASSERT_EQ(nullptr, thumb_bitmap.get());
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest,
        GetThumbnailAsBitmapFromThumbnailWithEmptyStream) {
   ASSERT_TRUE(OpenDocument("thumbnail_with_empty_stream.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
   ASSERT_EQ(nullptr, thumb_bitmap.get());
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest,
        GetThumbnailAsBitmapFromThumbnailWithNoFilters) {
   ASSERT_TRUE(OpenDocument("thumbnail_with_no_filters.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
 
   EXPECT_EQ(10, FPDFBitmap_GetWidth(thumb_bitmap.get()));
   EXPECT_EQ(10, FPDFBitmap_GetHeight(thumb_bitmap.get()));
   EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(thumb_bitmap.get()));
   CompareBitmap(thumb_bitmap.get(), 10, 10, "fe02583f9e6d094042a942ff686e9936");
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest, GetThumbnailDoesNotAlterPage) {
@@ -253,20 +236,20 @@
 
   const unsigned long kExpectedRawSize = 1851u;
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Get the raw data
-  unsigned long raw_size = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
+  unsigned long raw_size = FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0);
   ASSERT_EQ(kExpectedRawSize, raw_size);
   std::vector<uint8_t> raw_thumb_buf(raw_size);
 
-  EXPECT_EQ(kExpectedRawSize,
-            FPDFPage_GetRawThumbnailData(page, raw_thumb_buf.data(), raw_size));
+  EXPECT_EQ(kExpectedRawSize, FPDFPage_GetRawThumbnailData(
+                                  page.get(), raw_thumb_buf.data(), raw_size));
   EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(raw_thumb_buf));
 
   // Get the thumbnail
-  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
+  ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page.get()));
 
   EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
   EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
@@ -274,16 +257,15 @@
   CompareBitmap(thumb_bitmap.get(), 50, 50, "52b75451e396f55e95d1cb68e6018226");
 
   // Get the raw data again
-  unsigned long new_raw_size = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
+  unsigned long new_raw_size =
+      FPDFPage_GetRawThumbnailData(page.get(), nullptr, 0);
   ASSERT_EQ(kExpectedRawSize, new_raw_size);
   std::vector<uint8_t> new_raw_thumb_buf(new_raw_size);
 
   EXPECT_EQ(kExpectedRawSize,
-            FPDFPage_GetRawThumbnailData(page, new_raw_thumb_buf.data(),
+            FPDFPage_GetRawThumbnailData(page.get(), new_raw_thumb_buf.data(),
                                          new_raw_size));
   EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(new_raw_thumb_buf));
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFThumbnailEmbedderTest, GetThumbnailAsBitmapFromPageNullPage) {
diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp
index 789b641..bffe29c 100644
--- a/fpdfsdk/fpdf_view_embeddertest.cpp
+++ b/fpdfsdk/fpdf_view_embeddertest.cpp
@@ -365,7 +365,7 @@
 // Test for conversion of a point in page coordinates to device coordinates.
 TEST_F(FPDFViewEmbedderTest, PageCoordinatesToDeviceCoordinates) {
   ASSERT_TRUE(OpenDocument("about_blank.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
   // Display bounds in device coordinates
@@ -383,30 +383,30 @@
 
   int device_x = 0;
   int device_y = 0;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
 
   EXPECT_EQ(9, device_x);
   EXPECT_EQ(10, device_y);
 
   // Rotate 90 degrees clockwise
   rotate = 1;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
   EXPECT_EQ(626, device_x);
   EXPECT_EQ(7, device_y);
 
   // Rotate 180 degrees
   rotate = 2;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
   EXPECT_EQ(631, device_x);
   EXPECT_EQ(470, device_y);
 
   // Rotate 90 degrees counter-clockwise
   rotate = 3;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
   EXPECT_EQ(14, device_x);
   EXPECT_EQ(473, device_y);
 
@@ -414,16 +414,16 @@
   // modulo by 4. A value of 4 is expected to be converted into 0 (normal
   // rotation)
   rotate = 4;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
   EXPECT_EQ(9, device_x);
   EXPECT_EQ(10, device_y);
 
   // FPDF_PageToDevice() returns untransformed coordinates if |rotate| % 4 is
   // negative.
   rotate = -1;
-  EXPECT_TRUE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                page_x, page_y, &device_x, &device_y));
+  EXPECT_TRUE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                rotate, page_x, page_y, &device_x, &device_y));
   EXPECT_EQ(start_x, device_x);
   EXPECT_EQ(start_y, device_y);
 
@@ -437,10 +437,8 @@
   EXPECT_EQ(5678, device_y);
 
   // Negative case - invalid output parameters
-  EXPECT_FALSE(FPDF_PageToDevice(page, start_x, start_y, size_x, size_y, rotate,
-                                 page_x, page_y, nullptr, nullptr));
-
-  UnloadPage(page);
+  EXPECT_FALSE(FPDF_PageToDevice(page.get(), start_x, start_y, size_x, size_y,
+                                 rotate, page_x, page_y, nullptr, nullptr));
 }
 
 TEST_F(FPDFViewEmbedderTest, MultipleInitDestroy) {
@@ -633,14 +631,14 @@
 
 TEST_F(FPDFViewEmbedderTest, Page) {
   ASSERT_TRUE(OpenDocument("about_blank.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
 
-  EXPECT_FLOAT_EQ(612.0f, FPDF_GetPageWidthF(page));
-  EXPECT_FLOAT_EQ(792.0f, FPDF_GetPageHeightF(page));
+  EXPECT_FLOAT_EQ(612.0f, FPDF_GetPageWidthF(page.get()));
+  EXPECT_FLOAT_EQ(792.0f, FPDF_GetPageHeightF(page.get()));
 
   FS_RECTF rect;
-  EXPECT_TRUE(FPDF_GetPageBoundingBox(page, &rect));
+  EXPECT_TRUE(FPDF_GetPageBoundingBox(page.get(), &rect));
   EXPECT_EQ(0.0, rect.left);
   EXPECT_EQ(0.0, rect.bottom);
   EXPECT_EQ(612.0, rect.right);
@@ -650,10 +648,9 @@
   EXPECT_EQ(0.0, FPDF_GetPageWidth(nullptr));
   EXPECT_EQ(0.0, FPDF_GetPageHeight(nullptr));
   EXPECT_FALSE(FPDF_GetPageBoundingBox(nullptr, &rect));
-  EXPECT_FALSE(FPDF_GetPageBoundingBox(page, nullptr));
+  EXPECT_FALSE(FPDF_GetPageBoundingBox(page.get(), nullptr));
 
-  UnloadPage(page);
-  EXPECT_FALSE(LoadPage(1));
+  EXPECT_FALSE(LoadScopedPage(1));
 }
 
 TEST_F(FPDFViewEmbedderTest, ViewerRefDummy) {
@@ -1053,15 +1050,15 @@
       "c901239d17d84ac84cb6f2124da71b0d";
 
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  const float page_width = FPDF_GetPageWidthF(page);
-  const float page_height = FPDF_GetPageHeightF(page);
+  const float page_width = FPDF_GetPageWidthF(page.get());
+  const float page_height = FPDF_GetPageHeightF(page.get());
   EXPECT_FLOAT_EQ(200, page_width);
   EXPECT_FLOAT_EQ(300, page_height);
 
   using pdfium::RectanglesChecksum;
-  ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+  ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get());
   CompareBitmap(bitmap.get(), page_width, page_height, RectanglesChecksum());
 
   FS_RECTF page_rect{0, 0, page_width, page_height};
@@ -1069,56 +1066,58 @@
   // Try rendering with an identity matrix. The output should be the same as
   // the RenderLoadedPage() output.
   FS_MATRIX identity_matrix{1, 0, 0, 1, 0, 0};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height, identity_matrix,
-                                 page_rect, RectanglesChecksum());
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
+                                 identity_matrix, page_rect,
+                                 RectanglesChecksum());
 
   // Again render with an identity matrix but with a smaller clipping rect.
   FS_RECTF middle_of_page_rect{page_width / 4, page_height / 4,
                                page_width * 3 / 4, page_height * 3 / 4};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height, identity_matrix,
-                                 middle_of_page_rect, clipped_checksum);
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
+                                 identity_matrix, middle_of_page_rect,
+                                 clipped_checksum);
 
   // Now render again with the image scaled smaller.
   FS_MATRIX half_scale_matrix{0.5, 0, 0, 0.5, 0, 0};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  half_scale_matrix, page_rect,
                                  top_left_quarter_checksum);
 
   // Now render again with the image scaled larger horizontally (the right half
   // will be clipped).
   FS_MATRIX stretch_x_matrix{2, 0, 0, 1, 0, 0};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  stretch_x_matrix, page_rect,
                                  kHoriStretchedChecksum);
 
   // Try a 90 degree rotation clockwise but with the same bitmap size, so part
   // will be clipped.
   FS_MATRIX rotate_90_matrix{0, 1, -1, 0, page_width, 0};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  rotate_90_matrix, page_rect,
                                  rotated_90_clockwise_checksum);
 
   // 180 degree rotation clockwise.
   FS_MATRIX rotate_180_matrix{-1, 0, 0, -1, page_width, page_height};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  rotate_180_matrix, page_rect,
                                  rotated_180_clockwise_checksum);
 
   // 270 degree rotation clockwise.
   FS_MATRIX rotate_270_matrix{0, -1, 1, 0, 0, page_width};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  rotate_270_matrix, page_rect,
                                  rotated_270_clockwise_checksum);
 
   // Mirror horizontally.
   FS_MATRIX mirror_hori_matrix{-1, 0, 0, 1, page_width, 0};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  mirror_hori_matrix, page_rect,
                                  mirror_hori_checksum);
 
   // Mirror vertically.
   FS_MATRIX mirror_vert_matrix{1, 0, 0, -1, 0, page_height};
-  TestRenderPageBitmapWithMatrix(page, page_width, page_height,
+  TestRenderPageBitmapWithMatrix(page.get(), page_width, page_height,
                                  mirror_vert_matrix, page_rect,
                                  mirror_vert_checksum);
 
@@ -1128,27 +1127,27 @@
 
   // Render using an identity matrix and the whole bitmap area as clipping rect.
   FS_RECTF bitmap_rect{0, 0, bitmap_width, bitmap_height};
-  TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
+  TestRenderPageBitmapWithMatrix(page.get(), bitmap_width, bitmap_height,
                                  identity_matrix, bitmap_rect,
                                  larger_top_left_quarter_checksum);
 
   // Render using a scaling matrix to fill the larger bitmap.
   FS_MATRIX double_scale_matrix{2, 0, 0, 2, 0, 0};
-  TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
+  TestRenderPageBitmapWithMatrix(page.get(), bitmap_width, bitmap_height,
                                  double_scale_matrix, bitmap_rect,
                                  kLargerChecksum);
 
   // Render the larger image again but with clipping.
   FS_RECTF middle_of_bitmap_rect{bitmap_width / 4, bitmap_height / 4,
                                  bitmap_width * 3 / 4, bitmap_height * 3 / 4};
-  TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
+  TestRenderPageBitmapWithMatrix(page.get(), bitmap_width, bitmap_height,
                                  double_scale_matrix, middle_of_bitmap_rect,
                                  kLargerClippedChecksum);
 
   // On the larger bitmap, try a 90 degree rotation but with the same bitmap
   // size, so part will be clipped.
   FS_MATRIX rotate_90_scale_2_matrix{0, 2, -2, 0, bitmap_width, 0};
-  TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
+  TestRenderPageBitmapWithMatrix(page.get(), bitmap_width, bitmap_height,
                                  rotate_90_scale_2_matrix, bitmap_rect,
                                  kLargerRotatedChecksum);
 
@@ -1161,7 +1160,7 @@
   FS_MATRIX landscape_rotate_90_scale_2_matrix{
       0, 2, -2, 0, landscape_bitmap_width, 0};
   TestRenderPageBitmapWithMatrix(
-      page, landscape_bitmap_width, landscape_bitmap_height,
+      page.get(), landscape_bitmap_width, landscape_bitmap_height,
       landscape_rotate_90_scale_2_matrix, landscape_bitmap_rect,
       kLargerRotatedLandscapeChecksum);
 
@@ -1174,7 +1173,7 @@
                                 diagonal_bitmap_size};
   FS_MATRIX rotate_45_scale_2_matrix{
       sqrt2, sqrt2, -sqrt2, sqrt2, bitmap_height / sqrt2, 0};
-  TestRenderPageBitmapWithMatrix(page, diagonal_bitmap_size,
+  TestRenderPageBitmapWithMatrix(page.get(), diagonal_bitmap_size,
                                  diagonal_bitmap_size, rotate_45_scale_2_matrix,
                                  diagonal_bitmap_rect,
                                  larger_rotated_diagonal_checksum);
@@ -1193,11 +1192,9 @@
                             scale,
                             -tile_x * tile_bitmap_size,
                             -tile_y * tile_bitmap_size};
-  TestRenderPageBitmapWithMatrix(page, tile_bitmap_size, tile_bitmap_size,
+  TestRenderPageBitmapWithMatrix(page.get(), tile_bitmap_size, tile_bitmap_size,
                                  tile_2_1_matrix, tile_bitmap_rect,
                                  tile_checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, FPDFGetPageSizeByIndexF) {
@@ -1227,12 +1224,11 @@
 #endif  // PDF_ENABLE_XFA
 
   // Double-check against values from when page is actually parsed.
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_FLOAT_EQ(size.width, FPDF_GetPageWidthF(page));
-  EXPECT_FLOAT_EQ(size.height, FPDF_GetPageHeightF(page));
+  EXPECT_FLOAT_EQ(size.width, FPDF_GetPageWidthF(page.get()));
+  EXPECT_FLOAT_EQ(size.height, FPDF_GetPageHeightF(page.get()));
   EXPECT_EQ(1u, pDoc->GetParsedPageCountForTesting());
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, FPDFGetPageSizeByIndex) {
@@ -1265,12 +1261,11 @@
 #endif  // PDF_ENABLE_XFA
 
   // Double-check against values from when page is actually parsed.
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
-  EXPECT_EQ(width, FPDF_GetPageWidth(page));
-  EXPECT_EQ(height, FPDF_GetPageHeight(page));
+  EXPECT_EQ(width, FPDF_GetPageWidth(page.get()));
+  EXPECT_EQ(height, FPDF_GetPageHeight(page.get()));
   EXPECT_EQ(1u, pDoc->GetParsedPageCountForTesting());
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, GetXFAArrayData) {
@@ -1472,14 +1467,12 @@
   static const char kNoNativeTextChecksum[] =
       "288502887ffc63291f35a0573b944375";
   ASSERT_TRUE(OpenDocument("bug_664284.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  TestRenderPageBitmapWithFlags(page, 0, original_checksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_NO_NATIVETEXT,
+  TestRenderPageBitmapWithFlags(page.get(), 0, original_checksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_NO_NATIVETEXT,
                                 kNoNativeTextChecksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderAnnotationWithPrintingFlag) {
@@ -1491,16 +1484,15 @@
   }();
   static const char kPrintingChecksum[] = "3e235b9f88f652f2b97b1fc393924849";
   ASSERT_TRUE(OpenDocument("bug_1658.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // A yellow highlight is rendered with `FPDF_ANNOT` flag.
-  TestRenderPageBitmapWithFlags(page, FPDF_ANNOT, annotation_checksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_ANNOT, annotation_checksum);
 
   // After adding `FPDF_PRINTING` flag, the yellow highlight is not rendered.
-  TestRenderPageBitmapWithFlags(page, FPDF_PRINTING | FPDF_ANNOT,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_PRINTING | FPDF_ANNOT,
                                 kPrintingChecksum);
-  UnloadPage(page);
 }
 
 // TODO(crbug.com/pdfium/1955): Remove this test once pixel tests can pass with
@@ -1523,27 +1515,26 @@
   static const char kGrayscaleChecksum[] = "fe45ad56efe868ba82285fa5ffedc0cb";
 
   ASSERT_TRUE(OpenDocument("jpx_lzw.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  TestRenderPageBitmapWithFlags(page, 0, kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_ANNOT, kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_LCD_TEXT, kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_NO_NATIVETEXT, kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_GRAYSCALE, kGrayscaleChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_LIMITEDIMAGECACHE,
+  TestRenderPageBitmapWithFlags(page.get(), 0, kNormalChecksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_ANNOT, kNormalChecksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_LCD_TEXT, kNormalChecksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_NO_NATIVETEXT,
                                 kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_FORCEHALFTONE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_GRAYSCALE, kGrayscaleChecksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_LIMITEDIMAGECACHE,
                                 kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_PRINTING, kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHTEXT,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_FORCEHALFTONE,
                                 kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHIMAGE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_PRINTING, kNormalChecksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHTEXT,
                                 kNormalChecksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHPATH,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHIMAGE,
                                 kNormalChecksum);
-
-  UnloadPage(page);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHPATH,
+                                kNormalChecksum);
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderManyRectanglesWithFlags) {
@@ -1561,33 +1552,34 @@
   }();
 
   ASSERT_TRUE(OpenDocument("many_rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  TestRenderPageBitmapWithFlags(page, 0, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_ANNOT, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_LCD_TEXT, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_NO_NATIVETEXT,
+  TestRenderPageBitmapWithFlags(page.get(), 0, ManyRectanglesChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_ANNOT,
                                 ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_GRAYSCALE, grayscale_checksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_LIMITEDIMAGECACHE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_LCD_TEXT,
                                 ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_FORCEHALFTONE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_NO_NATIVETEXT,
                                 ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_PRINTING, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHTEXT,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_GRAYSCALE, grayscale_checksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_LIMITEDIMAGECACHE,
                                 ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHIMAGE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_FORCEHALFTONE,
                                 ManyRectanglesChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHPATH,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_PRINTING,
+                                ManyRectanglesChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHTEXT,
+                                ManyRectanglesChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHIMAGE,
+                                ManyRectanglesChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHPATH,
                                 no_smoothpath_checksum);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderManyRectanglesWithAndWithoutExternalMemory) {
   ASSERT_TRUE(OpenDocument("many_rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   const char* bgr_checksum = []() {
@@ -1597,11 +1589,13 @@
     return "ab6312e04c0d3f4e46fb302a45173d05";
   }();
   static constexpr int kBgrStride = 600;  // Width of 200 * 24 bits per pixel.
-  TestRenderPageBitmapWithInternalMemory(page, FPDFBitmap_BGR, bgr_checksum);
-  TestRenderPageBitmapWithInternalMemoryAndStride(page, FPDFBitmap_BGR,
+  TestRenderPageBitmapWithInternalMemory(page.get(), FPDFBitmap_BGR,
+                                         bgr_checksum);
+  TestRenderPageBitmapWithInternalMemoryAndStride(page.get(), FPDFBitmap_BGR,
                                                   kBgrStride, bgr_checksum);
-  TestRenderPageBitmapWithExternalMemory(page, FPDFBitmap_BGR, bgr_checksum);
-  TestRenderPageBitmapWithExternalMemoryAndNoStride(page, FPDFBitmap_BGR,
+  TestRenderPageBitmapWithExternalMemory(page.get(), FPDFBitmap_BGR,
+                                         bgr_checksum);
+  TestRenderPageBitmapWithExternalMemoryAndNoStride(page.get(), FPDFBitmap_BGR,
                                                     bgr_checksum);
 
   const char* gray_checksum = []() {
@@ -1611,53 +1605,55 @@
     return "b561c11edc44dc3972125a9b8744fa2f";
   }();
 
-  TestRenderPageBitmapWithInternalMemory(page, FPDFBitmap_Gray, gray_checksum);
+  TestRenderPageBitmapWithInternalMemory(page.get(), FPDFBitmap_Gray,
+                                         gray_checksum);
   static constexpr int kGrayStride = 200;  // Width of 200 * 8 bits per pixel.
-  TestRenderPageBitmapWithInternalMemoryAndStride(page, FPDFBitmap_Gray,
+  TestRenderPageBitmapWithInternalMemoryAndStride(page.get(), FPDFBitmap_Gray,
                                                   kGrayStride, gray_checksum);
-  TestRenderPageBitmapWithExternalMemory(page, FPDFBitmap_Gray, gray_checksum);
-  TestRenderPageBitmapWithExternalMemoryAndNoStride(page, FPDFBitmap_Gray,
+  TestRenderPageBitmapWithExternalMemory(page.get(), FPDFBitmap_Gray,
+                                         gray_checksum);
+  TestRenderPageBitmapWithExternalMemoryAndNoStride(page.get(), FPDFBitmap_Gray,
                                                     gray_checksum);
 
   static constexpr int kBgrxStride = 800;  // Width of 200 * 32 bits per pixel.
-  TestRenderPageBitmapWithInternalMemory(page, FPDFBitmap_BGRx,
+  TestRenderPageBitmapWithInternalMemory(page.get(), FPDFBitmap_BGRx,
                                          ManyRectanglesChecksum());
   TestRenderPageBitmapWithInternalMemoryAndStride(
-      page, FPDFBitmap_BGRx, kBgrxStride, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithExternalMemory(page, FPDFBitmap_BGRx,
+      page.get(), FPDFBitmap_BGRx, kBgrxStride, ManyRectanglesChecksum());
+  TestRenderPageBitmapWithExternalMemory(page.get(), FPDFBitmap_BGRx,
                                          ManyRectanglesChecksum());
-  TestRenderPageBitmapWithExternalMemoryAndNoStride(page, FPDFBitmap_BGRx,
+  TestRenderPageBitmapWithExternalMemoryAndNoStride(page.get(), FPDFBitmap_BGRx,
                                                     ManyRectanglesChecksum());
 
-  TestRenderPageBitmapWithInternalMemory(page, FPDFBitmap_BGRA,
+  TestRenderPageBitmapWithInternalMemory(page.get(), FPDFBitmap_BGRA,
                                          ManyRectanglesChecksum());
   TestRenderPageBitmapWithInternalMemoryAndStride(
-      page, FPDFBitmap_BGRA, kBgrxStride, ManyRectanglesChecksum());
-  TestRenderPageBitmapWithExternalMemory(page, FPDFBitmap_BGRA,
+      page.get(), FPDFBitmap_BGRA, kBgrxStride, ManyRectanglesChecksum());
+  TestRenderPageBitmapWithExternalMemory(page.get(), FPDFBitmap_BGRA,
                                          ManyRectanglesChecksum());
-  TestRenderPageBitmapWithExternalMemoryAndNoStride(page, FPDFBitmap_BGRA,
+  TestRenderPageBitmapWithExternalMemoryAndNoStride(page.get(), FPDFBitmap_BGRA,
                                                     ManyRectanglesChecksum());
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderHelloWorldWithFlags) {
   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   using pdfium::HelloWorldChecksum;
-  TestRenderPageBitmapWithFlags(page, 0, HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_ANNOT, HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_GRAYSCALE, HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_LIMITEDIMAGECACHE,
+  TestRenderPageBitmapWithFlags(page.get(), 0, HelloWorldChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_ANNOT, HelloWorldChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_GRAYSCALE,
                                 HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_FORCEHALFTONE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_LIMITEDIMAGECACHE,
                                 HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_PRINTING, HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHIMAGE,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_FORCEHALFTONE,
                                 HelloWorldChecksum());
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHPATH,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_PRINTING,
+                                HelloWorldChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHIMAGE,
+                                HelloWorldChecksum());
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHPATH,
                                 HelloWorldChecksum());
 
   const char* lcd_text_checksum = []() {
@@ -1693,16 +1689,15 @@
 #endif
   }();
 
-  TestRenderPageBitmapWithFlags(page, FPDF_LCD_TEXT, lcd_text_checksum);
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHTEXT,
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_LCD_TEXT, lcd_text_checksum);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHTEXT,
                                 no_smoothtext_checksum);
 
   // For text rendering, When anti-aliasing is disabled, LCD Optimization flag
   // will be ignored.
-  TestRenderPageBitmapWithFlags(page, FPDF_LCD_TEXT | FPDF_RENDER_NO_SMOOTHTEXT,
+  TestRenderPageBitmapWithFlags(page.get(),
+                                FPDF_LCD_TEXT | FPDF_RENDER_NO_SMOOTHTEXT,
                                 no_smoothtext_checksum);
-
-  UnloadPage(page);
 }
 
 // Deliberately disabled because this test case renders a large bitmap, which is
@@ -1716,32 +1711,29 @@
   static const char kChecksum[] = "a6056db6961f4e65c42ab2e246171fe1";
 
   ASSERT_TRUE(OpenDocument("bug_1646.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   constexpr int kWidth = 40000;
   constexpr int kHeight = 100;
-  TestRenderPageBitmapWithMatrix(page, kWidth, kHeight, {1000, 0, 0, 1, 0, 0},
-                                 {0, 0, kWidth, kHeight}, kChecksum);
-
-  UnloadPage(page);
+  TestRenderPageBitmapWithMatrix(page.get(), kWidth, kHeight,
+                                 {1000, 0, 0, 1, 0, 0}, {0, 0, kWidth, kHeight},
+                                 kChecksum);
 }
 
 #if BUILDFLAG(IS_WIN)
 TEST_F(FPDFViewEmbedderTest, FPDFRenderPageEmf) {
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page.get(), 0);
   EXPECT_EQ(3772u, emf_normal.size());
 
   // FPDF_REVERSE_BYTE_ORDER is ignored since EMFs are always BGR.
   std::vector<uint8_t> emf_reverse_byte_order =
-      RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
+      RenderPageWithFlagsToEmf(page.get(), FPDF_REVERSE_BYTE_ORDER);
   EXPECT_EQ(emf_normal, emf_reverse_byte_order);
-
-  UnloadPage(page);
 }
 
 class PostScriptRenderEmbedderTestBase : public FPDFViewEmbedderTest {
@@ -1783,36 +1775,32 @@
 
 TEST_F(PostScriptLevel2EmbedderTest, Rectangles) {
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page.get(), 0);
   std::string ps_data = GetPostScriptFromEmf(emf_normal);
   EXPECT_EQ(kExpectedRectanglePostScript, ps_data);
 
   // FPDF_REVERSE_BYTE_ORDER is ignored since PostScript is not bitmap-based.
   std::vector<uint8_t> emf_reverse_byte_order =
-      RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
+      RenderPageWithFlagsToEmf(page.get(), FPDF_REVERSE_BYTE_ORDER);
   EXPECT_EQ(emf_normal, emf_reverse_byte_order);
-
-  UnloadPage(page);
 }
 
 TEST_F(PostScriptLevel3EmbedderTest, Rectangles) {
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page.get(), 0);
   std::string ps_data = GetPostScriptFromEmf(emf_normal);
   EXPECT_EQ(kExpectedRectanglePostScript, ps_data);
 
   // FPDF_REVERSE_BYTE_ORDER is ignored since PostScript is not bitmap-based.
   std::vector<uint8_t> emf_reverse_byte_order =
-      RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
+      RenderPageWithFlagsToEmf(page.get(), FPDF_REVERSE_BYTE_ORDER);
   EXPECT_EQ(emf_normal, emf_reverse_byte_order);
-
-  UnloadPage(page);
 }
 
 TEST_F(PostScriptLevel2EmbedderTest, Image) {
@@ -1878,14 +1866,12 @@
       "restore\n";
 
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page.get(), 0);
   std::string ps_data = GetPostScriptFromEmf(emf);
   EXPECT_EQ(kExpected, ps_data);
-
-  UnloadPage(page);
 }
 
 TEST_F(PostScriptLevel3EmbedderTest, Image) {
@@ -1922,32 +1908,29 @@
 )";
 
   ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page.get(), 0);
   std::string ps_data = GetPostScriptFromEmf(emf);
   EXPECT_EQ(kExpected, ps_data);
-
-  UnloadPage(page);
 }
 
 TEST_F(FPDFViewEmbedderTest, ImageMask) {
   ASSERT_TRUE(OpenDocument("bug_674771.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Render the page with more efficient processing of image masks.
   FPDF_SetPrintMode(FPDF_PRINTMODE_EMF_IMAGE_MASKS);
-  std::vector<uint8_t> emf_image_masks = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf_image_masks =
+      RenderPageWithFlagsToEmf(page.get(), 0);
 
   // Render the page normally.
   FPDF_SetPrintMode(FPDF_PRINTMODE_EMF);
-  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
+  std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page.get(), 0);
 
   EXPECT_LT(emf_image_masks.size(), emf_normal.size());
-
-  UnloadPage(page);
 }
 #endif  // BUILDFLAG(IS_WIN)
 
@@ -2037,13 +2020,12 @@
 TEST_F(FPDFViewEmbedderTest, RenderXfaPage) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Should always be blank, as we're not testing `FPDF_FFLDraw()` here.
-  TestRenderPageBitmapWithFlags(page, 0, pdfium::kBlankPage612By792Checksum);
-
-  UnloadPage(page);
+  TestRenderPageBitmapWithFlags(page.get(), 0,
+                                pdfium::kBlankPage612By792Checksum);
 }
 
 #if defined(PDF_USE_SKIA)
@@ -2054,12 +2036,10 @@
 
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
-  TestRenderPageSkp(page, pdfium::RectanglesChecksum());
-
-  UnloadPage(page);
+  TestRenderPageSkp(page.get(), pdfium::RectanglesChecksum());
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderXfaPageToSkp) {
@@ -2069,13 +2049,11 @@
 
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
 
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   // Should always be blank, as we're not testing `FPDF_FFLRecord()` here.
-  TestRenderPageSkp(page, pdfium::kBlankPage612By792Checksum);
-
-  UnloadPage(page);
+  TestRenderPageSkp(page.get(), pdfium::kBlankPage612By792Checksum);
 }
 
 TEST_F(FPDFViewEmbedderTest, Bug2087) {
@@ -2091,14 +2069,13 @@
       .m_RendererType = FPDF_RENDERERTYPE_AGG,
   };
   FPDF_InitLibraryWithConfig(&kAggConfig);
+  ASSERT_TRUE(OpenDocument("rectangles.pdf"));
   {
-    ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-    FPDF_PAGE page = LoadPage(0);
-    ScopedFPDFBitmap bitmap = RenderPage(page);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    ScopedFPDFBitmap bitmap = RenderPage(page.get());
     agg_checksum = HashBitmap(bitmap.get());
-    UnloadPage(page);
-    CloseDocument();
   }
+  CloseDocument();
   FPDF_DestroyLibrary();
 
   std::string skia_checksum;
@@ -2109,14 +2086,13 @@
       .m_v8EmbedderSlot = 0,
   };
   FPDF_InitLibraryWithConfig(&kSkiaConfig);
+  ASSERT_TRUE(OpenDocument("rectangles.pdf"));
   {
-    ASSERT_TRUE(OpenDocument("rectangles.pdf"));
-    FPDF_PAGE page = LoadPage(0);
-    ScopedFPDFBitmap bitmap = RenderPage(page);
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    ScopedFPDFBitmap bitmap = RenderPage(page.get());
     skia_checksum = HashBitmap(bitmap.get());
-    UnloadPage(page);
-    CloseDocument();
   }
+  CloseDocument();
 
   EXPECT_NE(agg_checksum, skia_checksum);
 
@@ -2127,7 +2103,7 @@
 
 TEST_F(FPDFViewEmbedderTest, NoSmoothTextItalicOverlappingGlyphs) {
   ASSERT_TRUE(OpenDocument("bug_1919.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   const char* checksum = []() {
@@ -2143,8 +2119,8 @@
     return "5f99e2fa2bad09393d6428e105a83c96";
   }();
 
-  TestRenderPageBitmapWithFlags(page, FPDF_RENDER_NO_SMOOTHTEXT, checksum);
-  UnloadPage(page);
+  TestRenderPageBitmapWithFlags(page.get(), FPDF_RENDER_NO_SMOOTHTEXT,
+                                checksum);
 }
 
 TEST_F(FPDFViewEmbedderTest, RenderTransparencyOnWhiteBackground) {
diff --git a/fxjs/cjs_publicmethods_embeddertest.cpp b/fxjs/cjs_publicmethods_embeddertest.cpp
index 121896e..505dcf9 100644
--- a/fxjs/cjs_publicmethods_embeddertest.cpp
+++ b/fxjs/cjs_publicmethods_embeddertest.cpp
@@ -187,7 +187,7 @@
   v8::Context::Scope context_scope(GetV8Context());
 
   ASSERT_TRUE(OpenDocument("calculate.pdf"));
-  auto* page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   CJS_Runtime runtime(
@@ -206,7 +206,6 @@
   params.push_back(ary);
 
   CJS_Result ret = CJS_PublicMethods::AFSimple_Calculate(&runtime, params);
-  UnloadPage(page);
 
   runtime.GetCurrentEventContext()->SetValueForTest(nullptr);
 
@@ -221,7 +220,7 @@
   v8::Context::Scope context_scope(GetV8Context());
 
   ASSERT_TRUE(OpenDocument("calculate.pdf"));
-  auto* page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_TRUE(page);
 
   CJS_Runtime runtime(
@@ -251,7 +250,6 @@
   EXPECT_TRUE(!ret.HasError());
   EXPECT_TRUE(!ret.HasReturn());
 
-  UnloadPage(page);
 
   // Keep the *SAN bots happy. One of these is an UnownedPtr, another seems to
   // used during destruction. Clear them all to be safe and consistent.
diff --git a/xfa/fxfa/layout/cxfa_layoutitem_embeddertest.cpp b/xfa/fxfa/layout/cxfa_layoutitem_embeddertest.cpp
index feb24de..8831a68 100644
--- a/xfa/fxfa/layout/cxfa_layoutitem_embeddertest.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutitem_embeddertest.cpp
@@ -9,43 +9,37 @@
 
 TEST_F(CXFALayoutItemEmbedderTest, Bug1265) {
   ASSERT_TRUE(OpenDocument("bug_1265.pdf"));
-  FPDF_PAGE page0 = LoadPage(0);
-  FPDF_PAGE page1 = LoadPage(1);
-  EXPECT_TRUE(page0);
-  EXPECT_FALSE(page1);
-  UnloadPage(page0);
+  ScopedEmbedderTestPage page0 = LoadScopedPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(1);
+  EXPECT_TRUE(page0.get());
+  EXPECT_FALSE(page1.get());
 }
 
 TEST_F(CXFALayoutItemEmbedderTest, Bug1301) {
   ASSERT_TRUE(OpenDocument("bug_1301.pdf"));
-  FPDF_PAGE page0 = LoadPage(0);
-  FPDF_PAGE page1 = LoadPage(1);
-  FPDF_PAGE page2 = LoadPage(2);
-  EXPECT_TRUE(page0);
-  EXPECT_TRUE(page1);
-  EXPECT_FALSE(page2);
-  UnloadPage(page0);
-  UnloadPage(page1);
+  ScopedEmbedderTestPage page0 = LoadScopedPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(1);
+  ScopedEmbedderTestPage page2 = LoadScopedPage(2);
+  EXPECT_TRUE(page0.get());
+  EXPECT_TRUE(page1.get());
+  EXPECT_FALSE(page2.get());
 }
 
 TEST_F(CXFALayoutItemEmbedderTest, Bug306123) {
   ASSERT_TRUE(OpenDocument("bug_306123.pdf"));
-  FPDF_PAGE page0 = LoadPage(0);
-  FPDF_PAGE page1 = LoadPage(1);
-  FPDF_PAGE page2 = LoadPage(2);
-  EXPECT_TRUE(page0);
-  EXPECT_TRUE(page1);
-  EXPECT_FALSE(page2);
-  UnloadPage(page0);
-  UnloadPage(page1);
+  ScopedEmbedderTestPage page0 = LoadScopedPage(0);
+  ScopedEmbedderTestPage page1 = LoadScopedPage(1);
+  ScopedEmbedderTestPage page2 = LoadScopedPage(2);
+  EXPECT_TRUE(page0.get());
+  EXPECT_TRUE(page1.get());
+  EXPECT_FALSE(page2.get());
 }
 
 TEST_F(CXFALayoutItemEmbedderTest, BreakBeforeAfter) {
   static constexpr int kExpectedPageCount = 10;
   ASSERT_TRUE(OpenDocument("xfa/xfa_break_before_after.pdf"));
   for (int i = 0; i < kExpectedPageCount; ++i) {
-    FPDF_PAGE page = LoadPage(i);
+    ScopedEmbedderTestPage page = LoadScopedPage(i);
     EXPECT_TRUE(page);
-    UnloadPage(page);
   }
 }
diff --git a/xfa/fxfa/parser/cxfa_document_builder_embeddertest.cpp b/xfa/fxfa/parser/cxfa_document_builder_embeddertest.cpp
index dea2d73..0c28bb3 100644
--- a/xfa/fxfa/parser/cxfa_document_builder_embeddertest.cpp
+++ b/xfa/fxfa/parser/cxfa_document_builder_embeddertest.cpp
@@ -9,14 +9,12 @@
 
 TEST_F(CXFASimpleParserEmbedderTest, Bug216) {
   ASSERT_TRUE(OpenDocument("bug_216.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  UnloadPage(page);
 }
 
 TEST_F(CXFASimpleParserEmbedderTest, Bug709793) {
   ASSERT_TRUE(OpenDocument("bug_709793.pdf"));
-  FPDF_PAGE page = LoadPage(0);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   EXPECT_TRUE(page);
-  UnloadPage(page);
 }