Add FPDFEditEmbedderTest.ModifyFormObject.
Since there are no public APIs to modify page form objects, do it in the
test by directly modifying the CPDF_ object. Demonstrate that saving the
modified object does not work properly.
Also fix some nits in related FPDFEditEmbedderTest test cases.
Change-Id: If287a3c631b2d0571dfc614bcfa6f6e225e8f0c2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82452
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 5c91317..311c2de 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -2430,7 +2430,7 @@
}
}
-TEST_F(FPDFEditEmbedderTest, TestGetTextFontName) {
+TEST_F(FPDFEditEmbedderTest, GetTextFontName) {
ASSERT_TRUE(OpenDocument("text_font.pdf"));
FPDF_PAGE page = LoadPage(0);
ASSERT_TRUE(page);
@@ -2458,14 +2458,14 @@
UnloadPage(page);
}
-TEST_F(FPDFEditEmbedderTest, TestFormGetObjects) {
+TEST_F(FPDFEditEmbedderTest, FormGetObjects) {
ASSERT_TRUE(OpenDocument("form_object.pdf"));
FPDF_PAGE page = LoadPage(0);
ASSERT_TRUE(page);
ASSERT_EQ(1, FPDFPage_CountObjects(page));
FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
- EXPECT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
+ ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
ASSERT_EQ(-1, FPDFFormObj_CountObjects(nullptr));
ASSERT_EQ(2, FPDFFormObj_CountObjects(form));
@@ -2490,8 +2490,7 @@
ASSERT_EQ(nullptr, FPDFFormObj_GetObject(form, 2));
// Reset the form object matrix to identity.
- auto* pPageObj = CPDFPageObjectFromFPDFPageObject(form);
- CPDF_FormObject* pFormObj = pPageObj->AsForm();
+ CPDF_FormObject* pFormObj = CPDFPageObjectFromFPDFPageObject(form)->AsForm();
pFormObj->Transform(pFormObj->form_matrix().GetInverse());
// FPDFFormObj_GetMatrix() positive testing.
@@ -2515,6 +2514,62 @@
UnloadPage(page);
}
+TEST_F(FPDFEditEmbedderTest, ModifyFormObject) {
+#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
+#if defined(OS_WIN)
+ const char kOrigChecksum[] = "d511cae0c8ec3e7b2e7b672485a45859";
+#else
+ const char kOrigChecksum[] = "6332486c11a830d52163e453cac3f0f7";
+#endif // defined(OS_WIN)
+ const char kNewChecksum[] = "9851fb1b59d91655ac8961ac89f383ae";
+#else
+#if defined(OS_WIN)
+ const char kOrigChecksum[] = "9993d8fd85dfc1f9522c4e5f1533ed78";
+ const char kNewChecksum[] = "ba6450c9060786c5aca3b7552ba7ec9e";
+#elif defined(OS_APPLE)
+ const char kOrigChecksum[] = "98c13e90ec592eea79b6458c0ca2822b";
+ const char kNewChecksum[] = "8cbad8c9281e1f3bac2306a5beb1fdcd";
+#else
+ const char kOrigChecksum[] = "26e65fb47da5674d1b7284932c3c94d6";
+ const char kNewChecksum[] = "fd408e99373b275316f7816ae8d35842";
+#endif // defined(OS_WIN)
+#endif // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
+
+ ASSERT_TRUE(OpenDocument("form_object.pdf"));
+ FPDF_PAGE page = LoadPage(0);
+ ASSERT_TRUE(page);
+ ASSERT_EQ(1, FPDFPage_CountObjects(page));
+
+ {
+ ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+ CompareBitmap(bitmap.get(), 62, 69, kOrigChecksum);
+ }
+
+ FPDF_PAGEOBJECT form = FPDFPage_GetObject(page, 0);
+ ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(form));
+
+ // Access the CPDF_FormObject underneath, as there is no public API to set the
+ // matrix for form objects. (yet)
+ static constexpr FS_MATRIX kMatrix = {0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f};
+ CPDF_FormObject* pFormObj = CPDFPageObjectFromFPDFPageObject(form)->AsForm();
+ pFormObj->Transform(CFXMatrixFromFSMatrix(kMatrix));
+ pFormObj->SetDirty(true);
+
+ EXPECT_TRUE(FPDFPage_GenerateContent(page));
+
+ {
+ ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
+ CompareBitmap(bitmap.get(), 62, 69, kNewChecksum);
+ }
+
+ // TODO(thestig): This renders blank, but should not.
+ const char kBlankChecksum[] = "0617d6a83d3a8c0eeedcfd6e5b98f994";
+ EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
+ VerifySavedDocument(62, 69, kBlankChecksum);
+
+ UnloadPage(page);
+}
+
// Tests adding text from standard font using FPDFText_LoadStandardFont.
TEST_F(FPDFEditEmbedderTest, AddStandardFontText2) {
// Start with a blank page