blob: 6ee78d94233118c5ce43cef17217374221ab3627 [file] [log] [blame]
tsepez211d4ed2016-11-11 17:23:48 -08001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
xlou29561e52018-02-06 00:11:23 +00004
Lei Zhang3111d402022-04-18 22:24:07 +00005#include <iterator>
6
Lei Zhang2fc79bc2021-06-24 19:57:19 +00007#include "core/fpdfapi/page/cpdf_form.h"
8#include "core/fpdfapi/page/cpdf_formobject.h"
9#include "fpdfsdk/cpdfsdk_helpers.h"
Tom Sepeze08d2b12018-04-25 18:49:32 +000010#include "public/cpp/fpdf_scopers.h"
tsepez211d4ed2016-11-11 17:23:48 -080011#include "public/fpdf_edit.h"
Dan Sinclair957480c2017-06-13 15:21:14 -040012#include "public/fpdf_ppo.h"
Nicolas Pena3ff54002017-07-05 11:55:35 -040013#include "public/fpdf_save.h"
tsepez211d4ed2016-11-11 17:23:48 -080014#include "public/fpdfview.h"
15#include "testing/embedder_test.h"
Lei Zhang2fc79bc2021-06-24 19:57:19 +000016#include "testing/embedder_test_constants.h"
tsepez211d4ed2016-11-11 17:23:48 -080017#include "testing/gtest/include/gtest/gtest.h"
tsepez211d4ed2016-11-11 17:23:48 -080018
19namespace {
20
Lei Zhangab41f252018-12-23 03:10:50 +000021class FPDFPPOEmbedderTest : public EmbedderTest {};
tsepez211d4ed2016-11-11 17:23:48 -080022
Wei Li6bdd8242017-03-23 09:45:04 -070023int FakeBlockWriter(FPDF_FILEWRITE* pThis,
24 const void* pData,
25 unsigned long size) {
26 return size;
27}
28
tsepez211d4ed2016-11-11 17:23:48 -080029} // namespace
30
Lei Zhangab41f252018-12-23 03:10:50 +000031TEST_F(FPDFPPOEmbedderTest, NoViewerPreferences) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000032 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -080033
34 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
35 EXPECT_TRUE(output_doc);
36 EXPECT_FALSE(FPDF_CopyViewerPreferences(output_doc, document()));
37 FPDF_CloseDocument(output_doc);
38}
39
Lei Zhangab41f252018-12-23 03:10:50 +000040TEST_F(FPDFPPOEmbedderTest, ViewerPreferences) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000041 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -080042
43 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
44 EXPECT_TRUE(output_doc);
45 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
46 FPDF_CloseDocument(output_doc);
47}
48
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +000049TEST_F(FPDFPPOEmbedderTest, ImportPagesByIndex) {
50 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
51
52 FPDF_PAGE page = LoadPage(0);
53 EXPECT_TRUE(page);
54
55 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
56 ASSERT_TRUE(output_doc);
57 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc.get(), document()));
58
59 static constexpr int kPageIndices[] = {1};
Lei Zhang3111d402022-04-18 22:24:07 +000060 EXPECT_TRUE(FPDF_ImportPagesByIndex(
61 output_doc.get(), document(), kPageIndices, std::size(kPageIndices), 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +000062 EXPECT_EQ(1, FPDF_GetPageCount(output_doc.get()));
63
64 UnloadPage(page);
65}
66
Lei Zhangab41f252018-12-23 03:10:50 +000067TEST_F(FPDFPPOEmbedderTest, ImportPages) {
Wei Li6bdd8242017-03-23 09:45:04 -070068 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -080069
70 FPDF_PAGE page = LoadPage(0);
71 EXPECT_TRUE(page);
72
73 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
Wei Li6bdd8242017-03-23 09:45:04 -070074 ASSERT_TRUE(output_doc);
tsepez211d4ed2016-11-11 17:23:48 -080075 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
76 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0));
77 EXPECT_EQ(1, FPDF_GetPageCount(output_doc));
78 FPDF_CloseDocument(output_doc);
79
80 UnloadPage(page);
81}
82
Lei Zhangab41f252018-12-23 03:10:50 +000083TEST_F(FPDFPPOEmbedderTest, ImportNPages) {
xlou29561e52018-02-06 00:11:23 +000084 ASSERT_TRUE(OpenDocument("rectangles_multi_pages.pdf"));
xlou66ce22c2018-01-31 22:24:05 +000085
Tom Sepeze08d2b12018-04-25 18:49:32 +000086 ScopedFPDFDocument output_doc_2up(
xlou66ce22c2018-01-31 22:24:05 +000087 FPDF_ImportNPagesToOne(document(), 612, 792, 2, 1));
88 ASSERT_TRUE(output_doc_2up);
89 EXPECT_EQ(3, FPDF_GetPageCount(output_doc_2up.get()));
Tom Sepeze08d2b12018-04-25 18:49:32 +000090 ScopedFPDFDocument output_doc_5up(
xlou66ce22c2018-01-31 22:24:05 +000091 FPDF_ImportNPagesToOne(document(), 612, 792, 5, 1));
92 ASSERT_TRUE(output_doc_5up);
93 EXPECT_EQ(1, FPDF_GetPageCount(output_doc_5up.get()));
Tom Sepeze08d2b12018-04-25 18:49:32 +000094 ScopedFPDFDocument output_doc_8up(
xlou66ce22c2018-01-31 22:24:05 +000095 FPDF_ImportNPagesToOne(document(), 792, 612, 8, 1));
96 ASSERT_TRUE(output_doc_8up);
97 EXPECT_EQ(1, FPDF_GetPageCount(output_doc_8up.get()));
Tom Sepeze08d2b12018-04-25 18:49:32 +000098 ScopedFPDFDocument output_doc_128up(
xlou66ce22c2018-01-31 22:24:05 +000099 FPDF_ImportNPagesToOne(document(), 792, 612, 128, 1));
100 ASSERT_TRUE(output_doc_128up);
101 EXPECT_EQ(1, FPDF_GetPageCount(output_doc_128up.get()));
102}
103
Lei Zhangab41f252018-12-23 03:10:50 +0000104TEST_F(FPDFPPOEmbedderTest, BadNupParams) {
xlou29561e52018-02-06 00:11:23 +0000105 ASSERT_TRUE(OpenDocument("rectangles_multi_pages.pdf"));
xlou66ce22c2018-01-31 22:24:05 +0000106
107 FPDF_DOCUMENT output_doc_zero_row =
108 FPDF_ImportNPagesToOne(document(), 612, 792, 0, 3);
109 ASSERT_FALSE(output_doc_zero_row);
110 FPDF_DOCUMENT output_doc_zero_col =
111 FPDF_ImportNPagesToOne(document(), 612, 792, 2, 0);
112 ASSERT_FALSE(output_doc_zero_col);
113 FPDF_DOCUMENT output_doc_zero_width =
114 FPDF_ImportNPagesToOne(document(), 0, 792, 2, 1);
115 ASSERT_FALSE(output_doc_zero_width);
116 FPDF_DOCUMENT output_doc_zero_height =
117 FPDF_ImportNPagesToOne(document(), 612, 0, 7, 1);
118 ASSERT_FALSE(output_doc_zero_height);
119}
120
121// TODO(Xlou): Add more tests to check output doc content of
122// FPDF_ImportNPagesToOne()
Hui Yingst1fe2f412020-06-17 19:37:11 +0000123TEST_F(FPDFPPOEmbedderTest, NupRenderImage) {
xlou29561e52018-02-06 00:11:23 +0000124 ASSERT_TRUE(OpenDocument("rectangles_multi_pages.pdf"));
125 const int kPageCount = 2;
Hui Yingst1fe2f412020-06-17 19:37:11 +0000126#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
127 static constexpr const char* kExpectedMD5s[kPageCount] = {
Lei Zhanga2e776a2021-08-11 20:29:28 +0000128 "7a4cddd5a17a60ce50acb53e318d94f8", "4fa6a7507e9f3ef4f28719a7d656c3a5"};
Hui Yingst1fe2f412020-06-17 19:37:11 +0000129#else
Lei Zhang590f4242019-05-15 20:57:26 +0000130 static constexpr const char* kExpectedMD5s[kPageCount] = {
Lei Zhanga2e776a2021-08-11 20:29:28 +0000131 "72d0d7a19a2f40e010ca6a1133b33e1e", "fb18142190d770cfbc329d2b071aee4d"};
Hui Yingst1fe2f412020-06-17 19:37:11 +0000132#endif
Tom Sepeze08d2b12018-04-25 18:49:32 +0000133 ScopedFPDFDocument output_doc_3up(
xlou29561e52018-02-06 00:11:23 +0000134 FPDF_ImportNPagesToOne(document(), 792, 612, 3, 1));
135 ASSERT_TRUE(output_doc_3up);
136 ASSERT_EQ(kPageCount, FPDF_GetPageCount(output_doc_3up.get()));
137 for (int i = 0; i < kPageCount; ++i) {
Tom Sepeze08d2b12018-04-25 18:49:32 +0000138 ScopedFPDFPage page(FPDF_LoadPage(output_doc_3up.get(), i));
xlou29561e52018-02-06 00:11:23 +0000139 ASSERT_TRUE(page);
Lei Zhang30ff2532019-01-31 21:37:55 +0000140 ScopedFPDFBitmap bitmap = RenderPage(page.get());
xlou29561e52018-02-06 00:11:23 +0000141 EXPECT_EQ(792, FPDFBitmap_GetWidth(bitmap.get()));
142 EXPECT_EQ(612, FPDFBitmap_GetHeight(bitmap.get()));
143 EXPECT_EQ(kExpectedMD5s[i], HashBitmap(bitmap.get()));
144 }
145}
xlou66ce22c2018-01-31 22:24:05 +0000146
Lei Zhang2fc79bc2021-06-24 19:57:19 +0000147TEST_F(FPDFPPOEmbedderTest, ImportPageToXObject) {
148#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
149 static const char kChecksum[] = "d6ebc0a8afc22fe0137f54ce54e1a19c";
150#else
151 static const char kChecksum[] = "2d88d180af7109eb346439f7c855bb29";
152#endif
153
154 ASSERT_TRUE(OpenDocument("rectangles.pdf"));
155
156 {
157 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
158 ASSERT_TRUE(output_doc);
159
160 FPDF_XOBJECT xobject =
161 FPDF_NewXObjectFromPage(output_doc.get(), document(), 0);
162 ASSERT_TRUE(xobject);
163
164 for (int i = 0; i < 2; ++i) {
165 ScopedFPDFPage page(FPDFPage_New(output_doc.get(), 0, 612, 792));
166 ASSERT_TRUE(page);
167
168 FPDF_PAGEOBJECT page_object = FPDF_NewFormObjectFromXObject(xobject);
169 ASSERT_TRUE(page_object);
170 EXPECT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(page_object));
171 FPDFPage_InsertObject(page.get(), page_object);
172 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
173
174 // TODO(thestig): This should have `kChecksum`.
175 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
176 CompareBitmap(page_bitmap.get(), 612, 792,
177 pdfium::kBlankPage612By792Checksum);
178 }
179
180 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc.get(), this, 0));
181
182 FPDF_CloseXObject(xobject);
183 }
184
185 constexpr int kExpectedPageCount = 2;
186 ASSERT_TRUE(OpenSavedDocument());
187
188 FPDF_PAGE saved_pages[kExpectedPageCount];
189 FPDF_PAGEOBJECT xobjects[kExpectedPageCount];
190 for (int i = 0; i < kExpectedPageCount; ++i) {
191 saved_pages[i] = LoadSavedPage(i);
192 ASSERT_TRUE(saved_pages[i]);
193
194 EXPECT_EQ(1, FPDFPage_CountObjects(saved_pages[i]));
195 xobjects[i] = FPDFPage_GetObject(saved_pages[i], 0);
196 ASSERT_TRUE(xobjects[i]);
197 ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(xobjects[i]));
198 EXPECT_EQ(8, FPDFFormObj_CountObjects(xobjects[i]));
199
200 {
201 ScopedFPDFBitmap page_bitmap = RenderPage(saved_pages[i]);
202 CompareBitmap(page_bitmap.get(), 612, 792, kChecksum);
203 }
204 }
205
206 // Peek at object internals to make sure the two XObjects use the same stream.
207 EXPECT_NE(xobjects[0], xobjects[1]);
208 CPDF_PageObject* obj1 = CPDFPageObjectFromFPDFPageObject(xobjects[0]);
209 ASSERT_TRUE(obj1->AsForm());
210 ASSERT_TRUE(obj1->AsForm()->form());
211 ASSERT_TRUE(obj1->AsForm()->form()->GetStream());
212 CPDF_PageObject* obj2 = CPDFPageObjectFromFPDFPageObject(xobjects[1]);
213 ASSERT_TRUE(obj2->AsForm());
214 ASSERT_TRUE(obj2->AsForm()->form());
215 ASSERT_TRUE(obj2->AsForm()->form()->GetStream());
216 EXPECT_EQ(obj1->AsForm()->form()->GetStream(),
217 obj2->AsForm()->form()->GetStream());
218
219 for (FPDF_PAGE saved_page : saved_pages)
220 CloseSavedPage(saved_page);
221
222 CloseSavedDocument();
223}
224
225TEST_F(FPDFPPOEmbedderTest, ImportPageToXObjectWithSameDoc) {
226#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
227 static const char kChecksum[] = "8e7d672f49f9ca98fb9157824cefc204";
228#else
229 static const char kChecksum[] = "4d5ca14827b7707f8283e639b33c121a";
230#endif
231
232 ASSERT_TRUE(OpenDocument("rectangles.pdf"));
233
234 FPDF_XOBJECT xobject = FPDF_NewXObjectFromPage(document(), document(), 0);
235 ASSERT_TRUE(xobject);
236
237 FPDF_PAGE page = LoadPage(0);
238 ASSERT_TRUE(page);
239
240 {
241 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
242 CompareBitmap(bitmap.get(), 200, 300, pdfium::kRectanglesChecksum);
243 }
244
245 FPDF_PAGEOBJECT page_object = FPDF_NewFormObjectFromXObject(xobject);
246 ASSERT_TRUE(page_object);
247 ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(page_object));
248
Lei Zhang2fc79bc2021-06-24 19:57:19 +0000249 static constexpr FS_MATRIX kMatrix = {0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f};
Lei Zhang2193da92021-06-30 01:03:07 +0000250 EXPECT_TRUE(FPDFPageObj_SetMatrix(page_object, &kMatrix));
Lei Zhang2fc79bc2021-06-24 19:57:19 +0000251
252 FPDFPage_InsertObject(page, page_object);
253 EXPECT_TRUE(FPDFPage_GenerateContent(page));
254
255 {
256 // TODO(thestig): This should have `kChecksum`.
257 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
258 CompareBitmap(bitmap.get(), 200, 300, pdfium::kRectanglesChecksum);
259 }
260
261 FPDF_CloseXObject(xobject);
262
263 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
264 VerifySavedDocument(200, 300, kChecksum);
265
266 UnloadPage(page);
267}
268
269TEST_F(FPDFPPOEmbedderTest, XObjectNullParams) {
270 ASSERT_TRUE(OpenDocument("rectangles.pdf"));
271 ASSERT_EQ(1, FPDF_GetPageCount(document()));
272
273 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, nullptr, -1));
274 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, nullptr, 0));
275 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, nullptr, 1));
276 EXPECT_FALSE(FPDF_NewXObjectFromPage(document(), nullptr, -1));
277 EXPECT_FALSE(FPDF_NewXObjectFromPage(document(), nullptr, 0));
278 EXPECT_FALSE(FPDF_NewXObjectFromPage(document(), nullptr, 1));
279 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, document(), -1));
280 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, document(), 0));
281 EXPECT_FALSE(FPDF_NewXObjectFromPage(nullptr, document(), 1));
282
283 {
284 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
285 ASSERT_TRUE(output_doc);
286 EXPECT_FALSE(FPDF_NewXObjectFromPage(output_doc.get(), document(), -1));
287 EXPECT_FALSE(FPDF_NewXObjectFromPage(output_doc.get(), document(), 1));
288 }
289
290 // Should be a no-op.
291 FPDF_CloseXObject(nullptr);
292
293 EXPECT_FALSE(FPDF_NewFormObjectFromXObject(nullptr));
294}
295
Lei Zhang5ead3532019-01-29 00:13:53 +0000296TEST_F(FPDFPPOEmbedderTest, BUG_925981) {
297 ASSERT_TRUE(OpenDocument("bug_925981.pdf"));
298 ScopedFPDFDocument output_doc_2up(
299 FPDF_ImportNPagesToOne(document(), 612, 792, 2, 1));
300 EXPECT_EQ(1, FPDF_GetPageCount(output_doc_2up.get()));
301}
302
Lei Zhang096cf512021-08-11 20:20:28 +0000303TEST_F(FPDFPPOEmbedderTest, BUG_1229106) {
304 static constexpr int kPageCount = 4;
305 static constexpr int kTwoUpPageCount = 2;
306 static const char kRectsChecksum[] = "140d629b3c96a07ced2e3e408ea85a1d";
Lei Zhanga2e776a2021-08-11 20:29:28 +0000307 static const char kTwoUpChecksum[] = "fa4501562301b2e75da354bd067495ec";
Lei Zhang096cf512021-08-11 20:20:28 +0000308
309 ASSERT_TRUE(OpenDocument("bug_1229106.pdf"));
310
311 // Show all pages render the same.
312 ASSERT_EQ(kPageCount, FPDF_GetPageCount(document()));
313 for (int i = 0; i < kPageCount; ++i) {
314 FPDF_PAGE page = LoadPage(0);
315 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
316 CompareBitmap(bitmap.get(), 792, 612, kRectsChecksum);
317 UnloadPage(page);
318 }
319
320 // Create a 2-up PDF.
321 ScopedFPDFDocument output_doc_2up(
322 FPDF_ImportNPagesToOne(document(), 612, 792, 1, 2));
323 ASSERT_EQ(kTwoUpPageCount, FPDF_GetPageCount(output_doc_2up.get()));
324 for (int i = 0; i < kTwoUpPageCount; ++i) {
325 ScopedFPDFPage page(FPDF_LoadPage(output_doc_2up.get(), i));
326 ScopedFPDFBitmap bitmap = RenderPage(page.get());
Lei Zhanga2e776a2021-08-11 20:29:28 +0000327 CompareBitmap(bitmap.get(), 612, 792, kTwoUpChecksum);
Lei Zhang096cf512021-08-11 20:20:28 +0000328 }
329}
330
Lei Zhangab41f252018-12-23 03:10:50 +0000331TEST_F(FPDFPPOEmbedderTest, BadRepeatViewerPref) {
Wei Li6bdd8242017-03-23 09:45:04 -0700332 ASSERT_TRUE(OpenDocument("repeat_viewer_ref.pdf"));
333
334 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
335 EXPECT_TRUE(output_doc);
336 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
337
338 FPDF_FILEWRITE writer;
339 writer.version = 1;
340 writer.WriteBlock = FakeBlockWriter;
341
342 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc, &writer, 0));
343 FPDF_CloseDocument(output_doc);
344}
345
Lei Zhangab41f252018-12-23 03:10:50 +0000346TEST_F(FPDFPPOEmbedderTest, BadCircularViewerPref) {
Wei Li6bdd8242017-03-23 09:45:04 -0700347 ASSERT_TRUE(OpenDocument("circular_viewer_ref.pdf"));
348
349 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
350 EXPECT_TRUE(output_doc);
351 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
352
353 FPDF_FILEWRITE writer;
354 writer.version = 1;
355 writer.WriteBlock = FakeBlockWriter;
356
357 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc, &writer, 0));
358 FPDF_CloseDocument(output_doc);
359}
360
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000361TEST_F(FPDFPPOEmbedderTest, BadIndices) {
362 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
363
364 FPDF_PAGE page = LoadPage(0);
365 EXPECT_TRUE(page);
366
367 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
368 EXPECT_TRUE(output_doc);
369
370 static constexpr int kBadIndices1[] = {-1};
Lei Zhang3111d402022-04-18 22:24:07 +0000371 EXPECT_FALSE(FPDF_ImportPagesByIndex(
372 output_doc.get(), document(), kBadIndices1, std::size(kBadIndices1), 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000373
374 static constexpr int kBadIndices2[] = {1};
Lei Zhang3111d402022-04-18 22:24:07 +0000375 EXPECT_FALSE(FPDF_ImportPagesByIndex(
376 output_doc.get(), document(), kBadIndices2, std::size(kBadIndices2), 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000377
378 static constexpr int kBadIndices3[] = {-1, 0, 1};
Lei Zhang3111d402022-04-18 22:24:07 +0000379 EXPECT_FALSE(FPDF_ImportPagesByIndex(
380 output_doc.get(), document(), kBadIndices3, std::size(kBadIndices3), 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000381
382 static constexpr int kBadIndices4[] = {42};
Lei Zhang3111d402022-04-18 22:24:07 +0000383 EXPECT_FALSE(FPDF_ImportPagesByIndex(
384 output_doc.get(), document(), kBadIndices4, std::size(kBadIndices4), 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000385
386 UnloadPage(page);
387}
388
389TEST_F(FPDFPPOEmbedderTest, GoodIndices) {
390 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
391
392 FPDF_PAGE page = LoadPage(0);
393 EXPECT_TRUE(page);
394
395 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
396 EXPECT_TRUE(output_doc);
397
398 static constexpr int kGoodIndices1[] = {0, 0, 0, 0};
399 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc.get(), document(),
Lei Zhang3111d402022-04-18 22:24:07 +0000400 kGoodIndices1, std::size(kGoodIndices1),
401 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000402 EXPECT_EQ(4, FPDF_GetPageCount(output_doc.get()));
403
404 static constexpr int kGoodIndices2[] = {0};
405 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc.get(), document(),
Lei Zhang3111d402022-04-18 22:24:07 +0000406 kGoodIndices2, std::size(kGoodIndices2),
407 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000408 EXPECT_EQ(5, FPDF_GetPageCount(output_doc.get()));
409
410 static constexpr int kGoodIndices3[] = {4};
411 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc.get(), document(),
Lei Zhang3111d402022-04-18 22:24:07 +0000412 kGoodIndices3, std::size(kGoodIndices3),
413 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000414 EXPECT_EQ(6, FPDF_GetPageCount(output_doc.get()));
415
416 static constexpr int kGoodIndices4[] = {1, 2, 3};
417 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc.get(), document(),
Lei Zhang3111d402022-04-18 22:24:07 +0000418 kGoodIndices4, std::size(kGoodIndices4),
419 0));
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000420 EXPECT_EQ(9, FPDF_GetPageCount(output_doc.get()));
421
422 // Passing in a nullptr should import all the pages.
423 EXPECT_TRUE(
424 FPDF_ImportPagesByIndex(output_doc.get(), document(), nullptr, 0, 0));
425 EXPECT_EQ(14, FPDF_GetPageCount(output_doc.get()));
426
427 UnloadPage(page);
428}
429
Lei Zhangab41f252018-12-23 03:10:50 +0000430TEST_F(FPDFPPOEmbedderTest, BadRanges) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +0000431 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -0800432
433 FPDF_PAGE page = LoadPage(0);
434 EXPECT_TRUE(page);
435
436 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
437 EXPECT_TRUE(output_doc);
438 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "clams", 0));
439 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "0", 0));
440 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "42", 0));
441 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,2", 0));
442 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-2", 0));
443 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), ",1", 0));
444 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,", 0));
445 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-", 0));
446 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-1", 0));
447 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-,0,,,1-", 0));
448 FPDF_CloseDocument(output_doc);
449
450 UnloadPage(page);
451}
452
Lei Zhangab41f252018-12-23 03:10:50 +0000453TEST_F(FPDFPPOEmbedderTest, GoodRanges) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +0000454 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -0800455
456 FPDF_PAGE page = LoadPage(0);
457 EXPECT_TRUE(page);
458
459 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
460 EXPECT_TRUE(output_doc);
461 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
462 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1,1,1,1", 0));
Lei Zhangb7c41492018-05-08 19:01:28 +0000463 EXPECT_EQ(4, FPDF_GetPageCount(output_doc));
tsepez211d4ed2016-11-11 17:23:48 -0800464 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1-1", 0));
465 EXPECT_EQ(5, FPDF_GetPageCount(output_doc));
Lei Zhangb7c41492018-05-08 19:01:28 +0000466 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "5-5", 0));
467 EXPECT_EQ(6, FPDF_GetPageCount(output_doc));
468 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "2-4", 0));
469 EXPECT_EQ(9, FPDF_GetPageCount(output_doc));
tsepez211d4ed2016-11-11 17:23:48 -0800470 FPDF_CloseDocument(output_doc);
471
472 UnloadPage(page);
473}
tsepez6e1d6032016-11-11 17:55:40 -0800474
Lei Zhangab41f252018-12-23 03:10:50 +0000475TEST_F(FPDFPPOEmbedderTest, BUG_664284) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +0000476 ASSERT_TRUE(OpenDocument("bug_664284.pdf"));
tsepez6e1d6032016-11-11 17:55:40 -0800477
478 FPDF_PAGE page = LoadPage(0);
Dan Sinclair957480c2017-06-13 15:21:14 -0400479 ASSERT_NE(nullptr, page);
tsepez6e1d6032016-11-11 17:55:40 -0800480
481 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
482 EXPECT_TRUE(output_doc);
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000483
484 static constexpr int kIndices[] = {0};
485 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc, document(), kIndices,
Lei Zhang3111d402022-04-18 22:24:07 +0000486 std::size(kIndices), 0));
tsepez6e1d6032016-11-11 17:55:40 -0800487 FPDF_CloseDocument(output_doc);
488
489 UnloadPage(page);
490}
Dan Sinclair957480c2017-06-13 15:21:14 -0400491
Hui Yingst1fe2f412020-06-17 19:37:11 +0000492TEST_F(FPDFPPOEmbedderTest, BUG_750568) {
Lei Zhang03e5e682019-09-16 19:45:55 +0000493#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
Hui Yingst1fe2f412020-06-17 19:37:11 +0000494 const char* const kHashes[] = {
495 "eaa139e944eafb43d31e8742a0e158de", "226485e9d4fa6a67dfe0a88723f12060",
496 "c5601a3492ae5dcc5dd25140fc463bfe", "1f60055b54de4fac8a59c65e90da156e"};
Lei Zhang03e5e682019-09-16 19:45:55 +0000497#else
Lei Zhang98073c82017-07-31 19:33:25 -0700498 const char* const kHashes[] = {
499 "64ad08132a1c5a166768298c8a578f57", "83b83e2f6bc80707d0a917c7634140b9",
500 "913cd3723a451e4e46fbc2c05702d1ee", "81fb7cfd4860f855eb468f73dfeb6d60"};
Hui Yingst1fe2f412020-06-17 19:37:11 +0000501#endif
Lei Zhang98073c82017-07-31 19:33:25 -0700502
503 ASSERT_TRUE(OpenDocument("bug_750568.pdf"));
504 ASSERT_EQ(4, FPDF_GetPageCount(document()));
505
506 for (size_t i = 0; i < 4; ++i) {
507 FPDF_PAGE page = LoadPage(i);
Lei Zhang107fa7b2018-02-09 21:48:15 +0000508 ASSERT_TRUE(page);
Lei Zhang98073c82017-07-31 19:33:25 -0700509
Tom Sepeze08d2b12018-04-25 18:49:32 +0000510 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
Lei Zhang08580412021-08-11 19:20:18 +0000511 CompareBitmap(bitmap.get(), 200, 200, kHashes[i]);
Lei Zhang98073c82017-07-31 19:33:25 -0700512 UnloadPage(page);
Lei Zhang98073c82017-07-31 19:33:25 -0700513 }
514
515 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
516 ASSERT_TRUE(output_doc);
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000517
518 static constexpr int kIndices[] = {0, 1, 2, 3};
519 EXPECT_TRUE(FPDF_ImportPagesByIndex(output_doc, document(), kIndices,
Lei Zhang3111d402022-04-18 22:24:07 +0000520 std::size(kIndices), 0));
Lei Zhang98073c82017-07-31 19:33:25 -0700521 ASSERT_EQ(4, FPDF_GetPageCount(output_doc));
522 for (size_t i = 0; i < 4; ++i) {
523 FPDF_PAGE page = FPDF_LoadPage(output_doc, i);
Lei Zhang107fa7b2018-02-09 21:48:15 +0000524 ASSERT_TRUE(page);
Lei Zhang98073c82017-07-31 19:33:25 -0700525
Lei Zhang30ff2532019-01-31 21:37:55 +0000526 ScopedFPDFBitmap bitmap = RenderPage(page);
Lei Zhang08580412021-08-11 19:20:18 +0000527 CompareBitmap(bitmap.get(), 200, 200, kHashes[i]);
Lei Zhang98073c82017-07-31 19:33:25 -0700528 FPDF_ClosePage(page);
Lei Zhang98073c82017-07-31 19:33:25 -0700529 }
530 FPDF_CloseDocument(output_doc);
531}
532
Lei Zhangab41f252018-12-23 03:10:50 +0000533TEST_F(FPDFPPOEmbedderTest, ImportWithZeroLengthStream) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +0000534 ASSERT_TRUE(OpenDocument("zero_length_stream.pdf"));
Dan Sinclair957480c2017-06-13 15:21:14 -0400535 FPDF_PAGE page = LoadPage(0);
Lei Zhang107fa7b2018-02-09 21:48:15 +0000536 ASSERT_TRUE(page);
Dan Sinclair957480c2017-06-13 15:21:14 -0400537
Tom Sepeze08d2b12018-04-25 18:49:32 +0000538 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
Lei Zhang08580412021-08-11 19:20:18 +0000539 CompareBitmap(bitmap.get(), 200, 200, pdfium::kHelloWorldChecksum);
Lei Zhang75c81712018-02-08 17:22:39 +0000540 UnloadPage(page);
Dan Sinclair957480c2017-06-13 15:21:14 -0400541
Lei Zhang08580412021-08-11 19:20:18 +0000542 ScopedFPDFDocument new_doc(FPDF_CreateNewDocument());
543 ASSERT_TRUE(new_doc);
Daniel Hosseinian8f0cd0d2021-06-11 22:15:59 +0000544
545 static constexpr int kIndices[] = {0};
Lei Zhang08580412021-08-11 19:20:18 +0000546 EXPECT_TRUE(FPDF_ImportPagesByIndex(new_doc.get(), document(), kIndices,
Lei Zhang3111d402022-04-18 22:24:07 +0000547 std::size(kIndices), 0));
Dan Sinclair957480c2017-06-13 15:21:14 -0400548
Lei Zhang08580412021-08-11 19:20:18 +0000549 EXPECT_EQ(1, FPDF_GetPageCount(new_doc.get()));
550 ScopedFPDFPage new_page(FPDF_LoadPage(new_doc.get(), 0));
551 ASSERT_TRUE(new_page);
552 ScopedFPDFBitmap new_bitmap = RenderPage(new_page.get());
553 CompareBitmap(new_bitmap.get(), 200, 200, pdfium::kHelloWorldChecksum);
Dan Sinclair957480c2017-06-13 15:21:14 -0400554}