K. Moon | 832a694 | 2022-10-31 20:11:31 +0000 | [diff] [blame] | 1 | // Copyright 2016 The PDFium Authors |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Lei Zhang | 310ddbf | 2019-09-23 12:50:04 +0000 | [diff] [blame] | 5 | #include "build/build_config.h" |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 6 | #include "core/fxge/cfx_defaultrenderdevice.h" |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 7 | #include "public/fpdf_flatten.h" |
| 8 | #include "public/fpdfview.h" |
| 9 | #include "testing/embedder_test.h" |
Lei Zhang | e525dc3 | 2024-06-25 19:34:31 +0000 | [diff] [blame] | 10 | #include "testing/gmock/include/gmock/gmock.h" |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 11 | #include "testing/gtest/include/gtest/gtest.h" |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 12 | |
Lei Zhang | e525dc3 | 2024-06-25 19:34:31 +0000 | [diff] [blame] | 13 | using testing::HasSubstr; |
Lei Zhang | 74c148c | 2024-06-26 21:56:52 +0000 | [diff] [blame] | 14 | using testing::Not; |
Lei Zhang | e525dc3 | 2024-06-25 19:34:31 +0000 | [diff] [blame] | 15 | |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 16 | namespace { |
| 17 | |
Lei Zhang | ab41f25 | 2018-12-23 03:10:50 +0000 | [diff] [blame] | 18 | class FPDFFlattenEmbedderTest : public EmbedderTest {}; |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 19 | |
| 20 | } // namespace |
| 21 | |
Lei Zhang | ab41f25 | 2018-12-23 03:10:50 +0000 | [diff] [blame] | 22 | TEST_F(FPDFFlattenEmbedderTest, FlatNothing) { |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 23 | ASSERT_TRUE(OpenDocument("hello_world.pdf")); |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 24 | FPDF_PAGE page = LoadPage(0); |
| 25 | EXPECT_TRUE(page); |
| 26 | EXPECT_EQ(FLATTEN_NOTHINGTODO, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY)); |
| 27 | UnloadPage(page); |
| 28 | } |
| 29 | |
Lei Zhang | ab41f25 | 2018-12-23 03:10:50 +0000 | [diff] [blame] | 30 | TEST_F(FPDFFlattenEmbedderTest, FlatNormal) { |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 31 | ASSERT_TRUE(OpenDocument("annotiter.pdf")); |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 32 | FPDF_PAGE page = LoadPage(0); |
| 33 | EXPECT_TRUE(page); |
| 34 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY)); |
| 35 | UnloadPage(page); |
| 36 | } |
| 37 | |
Lei Zhang | ab41f25 | 2018-12-23 03:10:50 +0000 | [diff] [blame] | 38 | TEST_F(FPDFFlattenEmbedderTest, FlatPrint) { |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 39 | ASSERT_TRUE(OpenDocument("annotiter.pdf")); |
tsepez | d0ecd89 | 2016-11-08 17:30:04 -0800 | [diff] [blame] | 40 | FPDF_PAGE page = LoadPage(0); |
| 41 | EXPECT_TRUE(page); |
| 42 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 43 | UnloadPage(page); |
| 44 | } |
Lei Zhang | 3d3cf80 | 2018-10-02 18:01:26 +0000 | [diff] [blame] | 45 | |
Lei Zhang | e525dc3 | 2024-06-25 19:34:31 +0000 | [diff] [blame] | 46 | TEST_F(FPDFFlattenEmbedderTest, FlatWithBadFont) { |
| 47 | ASSERT_TRUE(OpenDocument("344775293.pdf")); |
| 48 | FPDF_PAGE page = LoadPage(0); |
| 49 | EXPECT_TRUE(page); |
| 50 | |
| 51 | FORM_OnLButtonDown(form_handle(), page, 0, 20, 30); |
| 52 | FORM_OnLButtonUp(form_handle(), page, 0, 20, 30); |
| 53 | |
| 54 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 55 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 56 | |
Lei Zhang | 74c148c | 2024-06-26 21:56:52 +0000 | [diff] [blame] | 57 | EXPECT_THAT(GetString(), Not(HasSubstr("/PDFDocEncoding"))); |
Lei Zhang | e525dc3 | 2024-06-25 19:34:31 +0000 | [diff] [blame] | 58 | UnloadPage(page); |
| 59 | } |
| 60 | |
Lei Zhang | 6efd10c | 2024-09-03 18:53:36 +0000 | [diff] [blame] | 61 | TEST_F(FPDFFlattenEmbedderTest, FlatWithFontNoBaseEncoding) { |
| 62 | ASSERT_TRUE(OpenDocument("363015187.pdf")); |
| 63 | FPDF_PAGE page = LoadPage(0); |
| 64 | EXPECT_TRUE(page); |
| 65 | |
| 66 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 67 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 68 | |
Lei Zhang | a4682f9 | 2024-09-03 18:54:39 +0000 | [diff] [blame] | 69 | EXPECT_THAT(GetString(), HasSubstr("/Differences")); |
Lei Zhang | 6efd10c | 2024-09-03 18:53:36 +0000 | [diff] [blame] | 70 | UnloadPage(page); |
| 71 | } |
| 72 | |
AbdAlRahmanGad | 09635f3 | 2024-06-25 01:06:33 +0000 | [diff] [blame] | 73 | TEST_F(FPDFFlattenEmbedderTest, Bug861842) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 74 | const char* checkbox_checksum = []() { |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 75 | if (CFX_DefaultRenderDevice::UseSkiaRenderer()) { |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 76 | #if BUILDFLAG(IS_APPLE) |
| 77 | return "84a527f16649880525a1a8edc6c24c16"; |
| 78 | #else |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 79 | return "95fdaa000e81c80892b8d370f77be970"; |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 80 | #endif |
| 81 | } |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 82 | #if BUILDFLAG(IS_APPLE) |
| 83 | return "6aafcb2d98da222964bcdbf5aa1f4f1f"; |
Hui Yingst | 7ebba63 | 2020-09-11 20:33:44 +0000 | [diff] [blame] | 84 | #else |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 85 | return "594265790b81df2d93120d33b72a6ada"; |
Hui Yingst | bf9eee1 | 2022-05-25 21:20:24 +0000 | [diff] [blame] | 86 | #endif |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 87 | }(); |
Lei Zhang | 310ddbf | 2019-09-23 12:50:04 +0000 | [diff] [blame] | 88 | |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 89 | ASSERT_TRUE(OpenDocument("bug_861842.pdf")); |
Lei Zhang | 310ddbf | 2019-09-23 12:50:04 +0000 | [diff] [blame] | 90 | FPDF_PAGE page = LoadPage(0); |
| 91 | ASSERT_TRUE(page); |
| 92 | |
| 93 | ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT); |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 94 | CompareBitmap(bitmap.get(), 100, 120, checkbox_checksum); |
Lei Zhang | 310ddbf | 2019-09-23 12:50:04 +0000 | [diff] [blame] | 95 | |
| 96 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 97 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 98 | |
| 99 | UnloadPage(page); |
| 100 | |
| 101 | // TODO(crbug.com/861842): This should not render blank. |
Hui Yingst | 627c158 | 2020-12-14 20:18:47 +0000 | [diff] [blame] | 102 | static constexpr char kBlankPageHash[] = "48400809c3862dae64b0cd00d51057a4"; |
Lei Zhang | 310ddbf | 2019-09-23 12:50:04 +0000 | [diff] [blame] | 103 | VerifySavedDocument(100, 120, kBlankPageHash); |
| 104 | } |
| 105 | |
AbdAlRahmanGad | 09635f3 | 2024-06-25 01:06:33 +0000 | [diff] [blame] | 106 | TEST_F(FPDFFlattenEmbedderTest, Bug889099) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 107 | const char* page_checksum = []() { |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 108 | if (CFX_DefaultRenderDevice::UseSkiaRenderer()) { |
Lei Zhang | 55fa8ed | 2023-10-21 01:08:34 +0000 | [diff] [blame] | 109 | #if BUILDFLAG(IS_WIN) |
| 110 | return "1d83328d2d1ca12b9c9ea5faa62ac515"; |
| 111 | #elif BUILDFLAG(IS_APPLE) |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 112 | return "3b6f937deec2d27029cbce02111dc065"; |
| 113 | #else |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 114 | return "de7119d99f42deab2f4215017bdb16af"; |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 115 | #endif |
| 116 | } |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 117 | #if BUILDFLAG(IS_APPLE) |
| 118 | return "049ed3f1e21fc72f929af3410c64bc8f"; |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 119 | #else |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 120 | return "3db87245e3f4e37f4cb18654bbe22d97"; |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 121 | #endif |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 122 | }(); |
| 123 | const char* flattened_page_checksum = []() { |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 124 | if (CFX_DefaultRenderDevice::UseSkiaRenderer()) { |
Lei Zhang | 55fa8ed | 2023-10-21 01:08:34 +0000 | [diff] [blame] | 125 | #if BUILDFLAG(IS_WIN) |
| 126 | return "07deccbd4a42aaf6bf45a525f0be388e"; |
| 127 | #elif BUILDFLAG(IS_APPLE) |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 128 | return "f1bbe115355a2ad6d8ac34c7ff14ba75"; |
| 129 | #else |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 130 | return "7978c7b3d643a5f0ac0f03ce759c55fe"; |
Lei Zhang | 28a72ee | 2023-10-20 21:24:51 +0000 | [diff] [blame] | 131 | #endif |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 132 | } |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 133 | #if BUILDFLAG(IS_APPLE) |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 134 | return "41debc60cf2a8f74c710ec6082d77b18"; |
| 135 | #else |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 136 | return "0832157462ea70fbbf053e14b1d6457f"; |
Hui Yingst | 9256bd6 | 2023-06-15 19:21:42 +0000 | [diff] [blame] | 137 | #endif |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 138 | }(); |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 139 | |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 140 | ASSERT_TRUE(OpenDocument("bug_889099.pdf")); |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 141 | FPDF_PAGE page = LoadPage(0); |
| 142 | ASSERT_TRUE(page); |
| 143 | |
| 144 | // The original document has a malformed media box; the height is -400. |
| 145 | ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT); |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 146 | CompareBitmap(bitmap.get(), 300, 400, page_checksum); |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 147 | |
| 148 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 149 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 150 | |
| 151 | UnloadPage(page); |
| 152 | |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 153 | VerifySavedDocument(300, 400, flattened_page_checksum); |
Daniel Hosseinian | cf5d383 | 2020-04-24 00:07:25 +0000 | [diff] [blame] | 154 | } |
| 155 | |
AbdAlRahmanGad | 09635f3 | 2024-06-25 01:06:33 +0000 | [diff] [blame] | 156 | TEST_F(FPDFFlattenEmbedderTest, Bug890322) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 157 | const char* checksum = []() { |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 158 | if (CFX_DefaultRenderDevice::UseSkiaRenderer()) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 159 | return "793689536cf64fe792c2f241888c0cf3"; |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 160 | } |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 161 | return "6c674642154408e877d88c6c082d67e9"; |
| 162 | }(); |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 163 | ASSERT_TRUE(OpenDocument("bug_890322.pdf")); |
Lei Zhang | 3d3cf80 | 2018-10-02 18:01:26 +0000 | [diff] [blame] | 164 | FPDF_PAGE page = LoadPage(0); |
| 165 | ASSERT_TRUE(page); |
| 166 | |
| 167 | ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT); |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 168 | CompareBitmap(bitmap.get(), 200, 200, checksum); |
Lei Zhang | 3d3cf80 | 2018-10-02 18:01:26 +0000 | [diff] [blame] | 169 | |
| 170 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 171 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 172 | |
| 173 | UnloadPage(page); |
| 174 | |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 175 | VerifySavedDocument(200, 200, checksum); |
Lei Zhang | 3d3cf80 | 2018-10-02 18:01:26 +0000 | [diff] [blame] | 176 | } |
Lei Zhang | 0233af4 | 2018-10-18 17:46:52 +0000 | [diff] [blame] | 177 | |
AbdAlRahmanGad | 09635f3 | 2024-06-25 01:06:33 +0000 | [diff] [blame] | 178 | TEST_F(FPDFFlattenEmbedderTest, Bug896366) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 179 | const char* checksum = []() { |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 180 | if (CFX_DefaultRenderDevice::UseSkiaRenderer()) { |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 181 | return "c3cccfadc4c5249e6aa0675e511fa4c3"; |
Lei Zhang | 334a9ca | 2023-10-24 17:47:10 +0000 | [diff] [blame] | 182 | } |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 183 | return "f71ab085c52c8445ae785eca3ec858b1"; |
| 184 | }(); |
Daniel Hosseinian | 5af51b6 | 2020-07-18 00:53:43 +0000 | [diff] [blame] | 185 | ASSERT_TRUE(OpenDocument("bug_896366.pdf")); |
Lei Zhang | 0233af4 | 2018-10-18 17:46:52 +0000 | [diff] [blame] | 186 | FPDF_PAGE page = LoadPage(0); |
| 187 | ASSERT_TRUE(page); |
| 188 | |
| 189 | ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page, FPDF_ANNOT); |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 190 | CompareBitmap(bitmap.get(), 612, 792, checksum); |
Lei Zhang | 0233af4 | 2018-10-18 17:46:52 +0000 | [diff] [blame] | 191 | |
| 192 | EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); |
| 193 | EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); |
| 194 | |
| 195 | UnloadPage(page); |
| 196 | |
Alan Screen | 623ac7b | 2022-09-21 16:47:55 +0000 | [diff] [blame] | 197 | VerifySavedDocument(612, 792, checksum); |
Lei Zhang | 0233af4 | 2018-10-18 17:46:52 +0000 | [diff] [blame] | 198 | } |