Test rendering an XFA page

Tests rendering an XFA page to both a bitmap and an SKP recorder. This
only tests the rendering calls, which should always render a blank page,
as the XFA elements are rendered later by FPDF_FFLDraw() or
FPDF_FFLRecord().

Bug: pdfium:1978
Change-Id: I31924e3897dcc9e71fc0dc49bb35167c1717ee15
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/103375
Auto-Submit: K. Moon <kmoon@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp
index d30ace9..788cecb 100644
--- a/fpdfsdk/fpdf_view_embeddertest.cpp
+++ b/fpdfsdk/fpdf_view_embeddertest.cpp
@@ -227,6 +227,26 @@
         page, format, /*bitmap_stride=*/0, expected_checksum);
   }
 
+#ifdef _SKIA_SUPPORT_
+  void TestRenderPageSkp(FPDF_PAGE page, const char* expected_checksum) {
+    int width = static_cast<int>(FPDF_GetPageWidth(page));
+    int height = static_cast<int>(FPDF_GetPageHeight(page));
+
+    FPDF_RECORDER opaque_recorder = FPDF_RenderPageSkp(page, width, height);
+    ASSERT_TRUE(opaque_recorder);
+
+    SkPictureRecorder* recorder =
+        reinterpret_cast<SkPictureRecorder*>(opaque_recorder);
+    sk_sp<SkPicture> picture = recorder->finishRecordingAsPicture();
+    delete recorder;
+    ASSERT_TRUE(picture);
+
+    ScopedFPDFBitmap bitmap = SkPictureToPdfiumBitmap(
+        std::move(picture), SkISize::Make(width, height));
+    CompareBitmap(bitmap.get(), width, height, expected_checksum);
+  }
+#endif  // _SKIA_SUPPORT_
+
  private:
   void TestRenderPageBitmapWithExternalMemoryImpl(
       FPDF_PAGE page,
@@ -1968,34 +1988,47 @@
   EXPECT_EQ(kExpectedEnds, ends);
 }
 
+TEST_F(FPDFViewEmbedderTest, RenderXfaPage) {
+  ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
+
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  // Should always be blank, as we're not testing `FPDF_FFLDraw()` here.
+  TestRenderPageBitmapWithFlags(page, 0, pdfium::kBlankPage612By792Checksum);
+
+  UnloadPage(page);
+}
+
 #ifdef _SKIA_SUPPORT_
 TEST_F(FPDFViewEmbedderTest, RenderPageToSkp) {
-  if (!CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
+  if (!CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
     GTEST_SKIP() << "FPDF_RenderPageSkp() only makes sense with Skia";
+  }
 
   ASSERT_TRUE(OpenDocument("rectangles.pdf"));
 
   FPDF_PAGE page = LoadPage(0);
   ASSERT_TRUE(page);
 
-  constexpr SkISize kOutputSize = SkISize::Make(200, 300);
+  TestRenderPageSkp(page, pdfium::RectanglesChecksum());
 
-  FPDF_RECORDER opaque_recorder =
-      FPDF_RenderPageSkp(page, kOutputSize.width(), kOutputSize.height());
   UnloadPage(page);
-  ASSERT_TRUE(opaque_recorder);
+}
 
-  SkPictureRecorder* recorder =
-      reinterpret_cast<SkPictureRecorder*>(opaque_recorder);
-  sk_sp<SkPicture> picture = recorder->finishRecordingAsPicture();
-  delete recorder;
-  ASSERT_TRUE(picture);
+TEST_F(FPDFViewEmbedderTest, RenderXfaPageToSkp) {
+  if (!CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
+    GTEST_SKIP() << "FPDF_RenderPageSkp() only makes sense with Skia";
+  }
 
-  ScopedFPDFBitmap bitmap =
-      SkPictureToPdfiumBitmap(std::move(picture), kOutputSize);
-  ASSERT_TRUE(bitmap);
+  ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
 
-  CompareBitmap(bitmap.get(), kOutputSize.width(), kOutputSize.height(),
-                pdfium::RectanglesChecksum());
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  // Should always be blank, as we're not testing `FPDF_FFLRecord()` here.
+  TestRenderPageSkp(page, pdfium::kBlankPage612By792Checksum);
+
+  UnloadPage(page);
 }
 #endif  // _SKIA_SUPPORT_