1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2015 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #include <set>
6*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
7*3ac0a46fSAndroid Build Coastguard Worker
8*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/bytestring.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "public/cpp/fpdf_scopers.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_doc.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_edit.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdfview.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "testing/embedder_test.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fx_string_testhelpers.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
18*3ac0a46fSAndroid Build Coastguard Worker
19*3ac0a46fSAndroid Build Coastguard Worker class FPDFDocEmbedderTest : public EmbedderTest {};
20*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,MultipleSamePage)21*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, MultipleSamePage) {
22*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
23*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document());
24*3ac0a46fSAndroid Build Coastguard Worker
25*3ac0a46fSAndroid Build Coastguard Worker std::set<FPDF_PAGE> unique_pages;
26*3ac0a46fSAndroid Build Coastguard Worker std::vector<ScopedFPDFPage> owned_pages(4);
27*3ac0a46fSAndroid Build Coastguard Worker for (auto& ref : owned_pages) {
28*3ac0a46fSAndroid Build Coastguard Worker ref.reset(FPDF_LoadPage(document(), 0));
29*3ac0a46fSAndroid Build Coastguard Worker unique_pages.insert(ref.get());
30*3ac0a46fSAndroid Build Coastguard Worker }
31*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
32*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1u, unique_pages.size());
33*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1u, pDoc->GetParsedPageCountForTesting());
34*3ac0a46fSAndroid Build Coastguard Worker #else // PDF_ENABLE_XFA
35*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(4u, unique_pages.size());
36*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(4u, pDoc->GetParsedPageCountForTesting());
37*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
38*3ac0a46fSAndroid Build Coastguard Worker }
39*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,DestGetPageIndex)40*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, DestGetPageIndex) {
41*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("named_dests.pdf"));
42*3ac0a46fSAndroid Build Coastguard Worker
43*3ac0a46fSAndroid Build Coastguard Worker // NULL argument cases.
44*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFDest_GetDestPageIndex(nullptr, nullptr));
45*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFDest_GetDestPageIndex(document(), nullptr));
46*3ac0a46fSAndroid Build Coastguard Worker
47*3ac0a46fSAndroid Build Coastguard Worker // Page number directly in item from Dests NameTree.
48*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
49*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
50*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFDest_GetDestPageIndex(document(), dest));
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker // Page number via object reference in item from Dests NameTree.
53*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "Next");
54*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
55*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFDest_GetDestPageIndex(document(), dest));
56*3ac0a46fSAndroid Build Coastguard Worker
57*3ac0a46fSAndroid Build Coastguard Worker // Page number directly in item from Dests dictionary.
58*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
59*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
60*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(11, FPDFDest_GetDestPageIndex(document(), dest));
61*3ac0a46fSAndroid Build Coastguard Worker
62*3ac0a46fSAndroid Build Coastguard Worker // Invalid object reference in item from Dests NameTree.
63*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "LastAlternate");
64*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
65*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFDest_GetDestPageIndex(document(), dest));
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,DestGetView)68*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, DestGetView) {
69*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("named_dests.pdf"));
70*3ac0a46fSAndroid Build Coastguard Worker
71*3ac0a46fSAndroid Build Coastguard Worker unsigned long numParams;
72*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT params[4];
73*3ac0a46fSAndroid Build Coastguard Worker
74*3ac0a46fSAndroid Build Coastguard Worker numParams = 42;
75*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
76*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_UNKNOWN_MODE),
77*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(nullptr, &numParams, params));
78*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0U, numParams);
79*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[0]);
80*3ac0a46fSAndroid Build Coastguard Worker
81*3ac0a46fSAndroid Build Coastguard Worker numParams = 42;
82*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
83*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
84*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
85*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_XYZ),
86*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(dest, &numParams, params));
87*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3U, numParams);
88*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, params[0]);
89*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, params[1]);
90*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(1, params[2]);
91*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[3]);
92*3ac0a46fSAndroid Build Coastguard Worker
93*3ac0a46fSAndroid Build Coastguard Worker numParams = 42;
94*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
95*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "Next");
96*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
97*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_FIT),
98*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(dest, &numParams, params));
99*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0U, numParams);
100*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[0]);
101*3ac0a46fSAndroid Build Coastguard Worker
102*3ac0a46fSAndroid Build Coastguard Worker numParams = 42;
103*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
104*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
105*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
106*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_XYZ),
107*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(dest, &numParams, params));
108*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3U, numParams);
109*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(200, params[0]);
110*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(400, params[1]);
111*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(800, params[2]);
112*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[3]);
113*3ac0a46fSAndroid Build Coastguard Worker
114*3ac0a46fSAndroid Build Coastguard Worker numParams = 42;
115*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
116*3ac0a46fSAndroid Build Coastguard Worker dest = FPDF_GetNamedDestByName(document(), "LastAlternate");
117*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
118*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_XYZ),
119*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(dest, &numParams, params));
120*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3U, numParams);
121*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, params[0]);
122*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, params[1]);
123*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-200, params[2]);
124*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[3]);
125*3ac0a46fSAndroid Build Coastguard Worker }
126*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,DestGetLocationInPage)127*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, DestGetLocationInPage) {
128*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("named_dests.pdf"));
129*3ac0a46fSAndroid Build Coastguard Worker
130*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
131*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
132*3ac0a46fSAndroid Build Coastguard Worker
133*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasX = 0;
134*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasY = 0;
135*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasZoom = 0;
136*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT x = -1.0f;
137*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT y = -1.0f;
138*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT zoom = -1.0f;
139*3ac0a46fSAndroid Build Coastguard Worker
140*3ac0a46fSAndroid Build Coastguard Worker // NULL argument case
141*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFDest_GetLocationInPage(nullptr, &hasX, &hasY, &hasZoom, &x,
142*3ac0a46fSAndroid Build Coastguard Worker &y, &zoom));
143*3ac0a46fSAndroid Build Coastguard Worker
144*3ac0a46fSAndroid Build Coastguard Worker // Actual argument case.
145*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(
146*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetLocationInPage(dest, &hasX, &hasY, &hasZoom, &x, &y, &zoom));
147*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasX);
148*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasY);
149*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasZoom);
150*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, x);
151*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, y);
152*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, zoom);
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,BUG_1506_1)155*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, BUG_1506_1) {
156*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_1506.pdf"));
157*3ac0a46fSAndroid Build Coastguard Worker
158*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
159*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(dest);
160*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3, FPDFDest_GetDestPageIndex(document(), dest));
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,BUG_1506_2)163*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, BUG_1506_2) {
164*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_1506.pdf"));
165*3ac0a46fSAndroid Build Coastguard Worker
166*3ac0a46fSAndroid Build Coastguard Worker std::vector<FPDF_PAGE> pages;
167*3ac0a46fSAndroid Build Coastguard Worker for (int i : {0, 2})
168*3ac0a46fSAndroid Build Coastguard Worker pages.push_back(LoadPage(i));
169*3ac0a46fSAndroid Build Coastguard Worker
170*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
171*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(dest);
172*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3, FPDFDest_GetDestPageIndex(document(), dest));
173*3ac0a46fSAndroid Build Coastguard Worker
174*3ac0a46fSAndroid Build Coastguard Worker for (FPDF_PAGE page : pages)
175*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
176*3ac0a46fSAndroid Build Coastguard Worker }
177*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,BUG_1506_3)178*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, BUG_1506_3) {
179*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_1506.pdf"));
180*3ac0a46fSAndroid Build Coastguard Worker
181*3ac0a46fSAndroid Build Coastguard Worker std::vector<FPDF_PAGE> pages;
182*3ac0a46fSAndroid Build Coastguard Worker for (int i : {0, 1, 3})
183*3ac0a46fSAndroid Build Coastguard Worker pages.push_back(LoadPage(i));
184*3ac0a46fSAndroid Build Coastguard Worker
185*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
186*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(dest);
187*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(3, FPDFDest_GetDestPageIndex(document(), dest));
188*3ac0a46fSAndroid Build Coastguard Worker
189*3ac0a46fSAndroid Build Coastguard Worker for (FPDF_PAGE page : pages)
190*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,BUG_680376)193*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, BUG_680376) {
194*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_680376.pdf"));
195*3ac0a46fSAndroid Build Coastguard Worker
196*3ac0a46fSAndroid Build Coastguard Worker // Page number directly in item from Dests NameTree.
197*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
198*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
199*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFDest_GetDestPageIndex(document(), dest));
200*3ac0a46fSAndroid Build Coastguard Worker }
201*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,BUG_821454)202*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, BUG_821454) {
203*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_821454.pdf"));
204*3ac0a46fSAndroid Build Coastguard Worker
205*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
206*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
207*3ac0a46fSAndroid Build Coastguard Worker
208*3ac0a46fSAndroid Build Coastguard Worker // Cover some invalid argument cases while we're at it.
209*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetLinkAtPoint(nullptr, 150, 360));
210*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFLink_GetLinkZOrderAtPoint(nullptr, 150, 360));
211*3ac0a46fSAndroid Build Coastguard Worker
212*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link1 = FPDFLink_GetLinkAtPoint(page, 150, 360);
213*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link1);
214*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link2 = FPDFLink_GetLinkAtPoint(page, 150, 420);
215*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link2);
216*3ac0a46fSAndroid Build Coastguard Worker
217*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFLink_GetLinkZOrderAtPoint(page, 150, 360));
218*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFLink_GetLinkZOrderAtPoint(page, 150, 420));
219*3ac0a46fSAndroid Build Coastguard Worker
220*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest1 = FPDFLink_GetDest(document(), link1);
221*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(dest1);
222*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest2 = FPDFLink_GetDest(document(), link2);
223*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(dest2);
224*3ac0a46fSAndroid Build Coastguard Worker
225*3ac0a46fSAndroid Build Coastguard Worker // Cover more invalid argument cases while we're at it.
226*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetDest(nullptr, nullptr));
227*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetDest(nullptr, link1));
228*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetDest(document(), nullptr));
229*3ac0a46fSAndroid Build Coastguard Worker
230*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFDest_GetDestPageIndex(document(), dest1));
231*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFDest_GetDestPageIndex(document(), dest2));
232*3ac0a46fSAndroid Build Coastguard Worker
233*3ac0a46fSAndroid Build Coastguard Worker {
234*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_x_coord;
235*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_y_coord;
236*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_zoom;
237*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT x;
238*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT y;
239*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT zoom;
240*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL success = FPDFDest_GetLocationInPage(
241*3ac0a46fSAndroid Build Coastguard Worker dest1, &has_x_coord, &has_y_coord, &has_zoom, &x, &y, &zoom);
242*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(success);
243*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(has_x_coord);
244*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(has_y_coord);
245*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(has_zoom);
246*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(100.0f, x);
247*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(200.0f, y);
248*3ac0a46fSAndroid Build Coastguard Worker }
249*3ac0a46fSAndroid Build Coastguard Worker {
250*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_x_coord;
251*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_y_coord;
252*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL has_zoom;
253*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT x;
254*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT y;
255*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT zoom;
256*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL success = FPDFDest_GetLocationInPage(
257*3ac0a46fSAndroid Build Coastguard Worker dest2, &has_x_coord, &has_y_coord, &has_zoom, &x, &y, &zoom);
258*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(success);
259*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(has_x_coord);
260*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(has_y_coord);
261*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(has_zoom);
262*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(150.0f, x);
263*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(250.0f, y);
264*3ac0a46fSAndroid Build Coastguard Worker }
265*3ac0a46fSAndroid Build Coastguard Worker
266*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
267*3ac0a46fSAndroid Build Coastguard Worker }
268*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionBadArguments)269*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionBadArguments) {
270*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("launch_action.pdf"));
271*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_UNSUPPORTED),
272*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(nullptr));
273*3ac0a46fSAndroid Build Coastguard Worker
274*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFAction_GetDest(nullptr, nullptr));
275*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFAction_GetDest(document(), nullptr));
276*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetFilePath(nullptr, nullptr, 0));
277*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetURIPath(nullptr, nullptr, nullptr, 0));
278*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), nullptr, nullptr, 0));
279*3ac0a46fSAndroid Build Coastguard Worker }
280*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionLaunch)281*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionLaunch) {
282*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("launch_action.pdf"));
283*3ac0a46fSAndroid Build Coastguard Worker
284*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
285*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
286*3ac0a46fSAndroid Build Coastguard Worker
287*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
288*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
289*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
290*3ac0a46fSAndroid Build Coastguard Worker
291*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
292*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
293*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_LAUNCH),
294*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
295*3ac0a46fSAndroid Build Coastguard Worker
296*3ac0a46fSAndroid Build Coastguard Worker const char kExpectedResult[] = "test.pdf";
297*3ac0a46fSAndroid Build Coastguard Worker const unsigned long kExpectedLength = sizeof(kExpectedResult);
298*3ac0a46fSAndroid Build Coastguard Worker unsigned long bufsize = FPDFAction_GetFilePath(action, nullptr, 0);
299*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, bufsize);
300*3ac0a46fSAndroid Build Coastguard Worker
301*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
302*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(bufsize, FPDFAction_GetFilePath(action, buf, bufsize));
303*3ac0a46fSAndroid Build Coastguard Worker EXPECT_STREQ(kExpectedResult, buf);
304*3ac0a46fSAndroid Build Coastguard Worker
305*3ac0a46fSAndroid Build Coastguard Worker // Other public methods are not appropriate for launch actions.
306*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFAction_GetDest(document(), action));
307*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
308*3ac0a46fSAndroid Build Coastguard Worker
309*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
310*3ac0a46fSAndroid Build Coastguard Worker }
311*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionUri)312*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionUri) {
313*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("uri_action.pdf"));
314*3ac0a46fSAndroid Build Coastguard Worker
315*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
316*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
317*3ac0a46fSAndroid Build Coastguard Worker
318*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
319*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
320*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
321*3ac0a46fSAndroid Build Coastguard Worker
322*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
323*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
324*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_URI),
325*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
326*3ac0a46fSAndroid Build Coastguard Worker
327*3ac0a46fSAndroid Build Coastguard Worker const char kExpectedResult[] = "https://example.com/page.html";
328*3ac0a46fSAndroid Build Coastguard Worker const unsigned long kExpectedLength = sizeof(kExpectedResult);
329*3ac0a46fSAndroid Build Coastguard Worker unsigned long bufsize = FPDFAction_GetURIPath(document(), action, nullptr, 0);
330*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedLength, bufsize);
331*3ac0a46fSAndroid Build Coastguard Worker
332*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
333*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(bufsize, FPDFAction_GetURIPath(document(), action, buf, bufsize));
334*3ac0a46fSAndroid Build Coastguard Worker EXPECT_STREQ(kExpectedResult, buf);
335*3ac0a46fSAndroid Build Coastguard Worker
336*3ac0a46fSAndroid Build Coastguard Worker // Other public methods are not appropriate for URI actions
337*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFAction_GetDest(document(), action));
338*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
339*3ac0a46fSAndroid Build Coastguard Worker
340*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
341*3ac0a46fSAndroid Build Coastguard Worker }
342*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionUriNonAscii)343*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionUriNonAscii) {
344*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("uri_action_nonascii.pdf"));
345*3ac0a46fSAndroid Build Coastguard Worker
346*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
347*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
348*3ac0a46fSAndroid Build Coastguard Worker
349*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
350*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
351*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
352*3ac0a46fSAndroid Build Coastguard Worker
353*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
354*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
355*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_URI),
356*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
357*3ac0a46fSAndroid Build Coastguard Worker
358*3ac0a46fSAndroid Build Coastguard Worker // FPDFAction_GetURIPath() may return data in any encoding, or even with bad
359*3ac0a46fSAndroid Build Coastguard Worker // encoding.
360*3ac0a46fSAndroid Build Coastguard Worker const char kExpectedResult[] =
361*3ac0a46fSAndroid Build Coastguard Worker "https://example.com/\xA5octal\xC7"
362*3ac0a46fSAndroid Build Coastguard Worker "chars";
363*3ac0a46fSAndroid Build Coastguard Worker const unsigned long kExpectedLength = sizeof(kExpectedResult);
364*3ac0a46fSAndroid Build Coastguard Worker unsigned long bufsize = FPDFAction_GetURIPath(document(), action, nullptr, 0);
365*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedLength, bufsize);
366*3ac0a46fSAndroid Build Coastguard Worker
367*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
368*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(bufsize, FPDFAction_GetURIPath(document(), action, buf, bufsize));
369*3ac0a46fSAndroid Build Coastguard Worker EXPECT_STREQ(kExpectedResult, buf);
370*3ac0a46fSAndroid Build Coastguard Worker
371*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
372*3ac0a46fSAndroid Build Coastguard Worker }
373*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,LinkToAnnotConversion)374*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, LinkToAnnotConversion) {
375*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("annots.pdf"));
376*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
377*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
378*3ac0a46fSAndroid Build Coastguard Worker {
379*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK first_link = FPDFLink_GetLinkAtPoint(page, 69.00, 653.00);
380*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFAnnotation first_annot(FPDFLink_GetAnnot(page, first_link));
381*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, first_annot.get()));
382*3ac0a46fSAndroid Build Coastguard Worker
383*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK second_link = FPDFLink_GetLinkAtPoint(page, 80.00, 633.00);
384*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFAnnotation second_annot(FPDFLink_GetAnnot(page, second_link));
385*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page, second_annot.get()));
386*3ac0a46fSAndroid Build Coastguard Worker
387*3ac0a46fSAndroid Build Coastguard Worker // Also test invalid arguments.
388*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetAnnot(nullptr, nullptr));
389*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetAnnot(page, nullptr));
390*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFLink_GetAnnot(nullptr, second_link));
391*3ac0a46fSAndroid Build Coastguard Worker }
392*3ac0a46fSAndroid Build Coastguard Worker
393*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
394*3ac0a46fSAndroid Build Coastguard Worker }
395*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionGoto)396*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionGoto) {
397*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("goto_action.pdf"));
398*3ac0a46fSAndroid Build Coastguard Worker
399*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
400*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
401*3ac0a46fSAndroid Build Coastguard Worker
402*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
403*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
404*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
405*3ac0a46fSAndroid Build Coastguard Worker
406*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
407*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
408*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_GOTO),
409*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
410*3ac0a46fSAndroid Build Coastguard Worker
411*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFAction_GetDest(document(), action));
412*3ac0a46fSAndroid Build Coastguard Worker
413*3ac0a46fSAndroid Build Coastguard Worker // Other public methods are not appropriate for GoTo actions.
414*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
415*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
416*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
417*3ac0a46fSAndroid Build Coastguard Worker
418*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
419*3ac0a46fSAndroid Build Coastguard Worker }
420*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionEmbeddedGoto)421*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionEmbeddedGoto) {
422*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("gotoe_action.pdf"));
423*3ac0a46fSAndroid Build Coastguard Worker
424*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
425*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
426*3ac0a46fSAndroid Build Coastguard Worker
427*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
428*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
429*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
430*3ac0a46fSAndroid Build Coastguard Worker
431*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
432*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
433*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_EMBEDDEDGOTO),
434*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
435*3ac0a46fSAndroid Build Coastguard Worker
436*3ac0a46fSAndroid Build Coastguard Worker FPDF_DEST dest = FPDFAction_GetDest(document(), action);
437*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(dest);
438*3ac0a46fSAndroid Build Coastguard Worker
439*3ac0a46fSAndroid Build Coastguard Worker unsigned long num_params = 42;
440*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT params[4];
441*3ac0a46fSAndroid Build Coastguard Worker std::fill_n(params, 4, 42.4242f);
442*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFDEST_VIEW_FIT),
443*3ac0a46fSAndroid Build Coastguard Worker FPDFDest_GetView(dest, &num_params, params));
444*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, num_params);
445*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(42.4242f, params[0]);
446*3ac0a46fSAndroid Build Coastguard Worker
447*3ac0a46fSAndroid Build Coastguard Worker const char kExpectedResult[] = "ExampleFile.pdf";
448*3ac0a46fSAndroid Build Coastguard Worker const unsigned long kExpectedLength = sizeof(kExpectedResult);
449*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
450*3ac0a46fSAndroid Build Coastguard Worker unsigned long bufsize = FPDFAction_GetFilePath(action, nullptr, 0);
451*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, bufsize);
452*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFAction_GetFilePath(action, buf, bufsize));
453*3ac0a46fSAndroid Build Coastguard Worker EXPECT_STREQ(kExpectedResult, buf);
454*3ac0a46fSAndroid Build Coastguard Worker
455*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
456*3ac0a46fSAndroid Build Coastguard Worker }
457*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,ActionNonesuch)458*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, ActionNonesuch) {
459*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("nonesuch_action.pdf"));
460*3ac0a46fSAndroid Build Coastguard Worker
461*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
462*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
463*3ac0a46fSAndroid Build Coastguard Worker
464*3ac0a46fSAndroid Build Coastguard Worker // The target action is nearly the size of the whole page.
465*3ac0a46fSAndroid Build Coastguard Worker FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100);
466*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(link);
467*3ac0a46fSAndroid Build Coastguard Worker
468*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDFLink_GetAction(link);
469*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(action);
470*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_UNSUPPORTED),
471*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
472*3ac0a46fSAndroid Build Coastguard Worker
473*3ac0a46fSAndroid Build Coastguard Worker // No public methods are appropriate for unsupported actions.
474*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
475*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFAction_GetDest(document(), action));
476*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf)));
477*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf)));
478*3ac0a46fSAndroid Build Coastguard Worker
479*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
480*3ac0a46fSAndroid Build Coastguard Worker }
481*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,NoBookmarks)482*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, NoBookmarks) {
483*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
484*3ac0a46fSAndroid Build Coastguard Worker
485*3ac0a46fSAndroid Build Coastguard Worker // Open a file with no bookmarks.
486*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("named_dests.pdf"));
487*3ac0a46fSAndroid Build Coastguard Worker
488*3ac0a46fSAndroid Build Coastguard Worker // NULL argument cases.
489*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFBookmark_GetTitle(nullptr, buf, sizeof(buf)));
490*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetFirstChild(nullptr, nullptr));
491*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetFirstChild(document(), nullptr));
492*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetNextSibling(nullptr, nullptr));
493*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetNextSibling(document(), nullptr));
494*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(nullptr, nullptr));
495*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(document(), nullptr));
496*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetDest(nullptr, nullptr));
497*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetDest(document(), nullptr));
498*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetAction(nullptr));
499*3ac0a46fSAndroid Build Coastguard Worker }
500*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,Bookmarks)501*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, Bookmarks) {
502*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
503*3ac0a46fSAndroid Build Coastguard Worker
504*3ac0a46fSAndroid Build Coastguard Worker // Open a file with many bookmarks.
505*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bookmarks.pdf"));
506*3ac0a46fSAndroid Build Coastguard Worker
507*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOKMARK child = FPDFBookmark_GetFirstChild(document(), nullptr);
508*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(child);
509*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(34u, FPDFBookmark_GetTitle(child, buf, sizeof(buf)));
510*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"A Good Beginning", GetPlatformWString(buf));
511*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFBookmark_GetCount(child));
512*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFBookmark_GetCount(nullptr));
513*3ac0a46fSAndroid Build Coastguard Worker
514*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetDest(document(), child));
515*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetAction(child));
516*3ac0a46fSAndroid Build Coastguard Worker
517*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOKMARK grand_child = FPDFBookmark_GetFirstChild(document(), child);
518*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(grand_child);
519*3ac0a46fSAndroid Build Coastguard Worker
520*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOKMARK sibling = FPDFBookmark_GetNextSibling(document(), child);
521*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(sibling);
522*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(24u, FPDFBookmark_GetTitle(sibling, buf, sizeof(buf)));
523*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"Open Middle", GetPlatformWString(buf));
524*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFBookmark_GetAction(sibling));
525*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFBookmark_GetCount(sibling));
526*3ac0a46fSAndroid Build Coastguard Worker
527*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOKMARK sibling2 = FPDFBookmark_GetNextSibling(document(), sibling);
528*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(sibling2);
529*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(42u, FPDFBookmark_GetTitle(sibling2, buf, sizeof(buf)));
530*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"A Good Closed Ending", GetPlatformWString(buf));
531*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-2, FPDFBookmark_GetCount(sibling2));
532*3ac0a46fSAndroid Build Coastguard Worker
533*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetNextSibling(document(), sibling2));
534*3ac0a46fSAndroid Build Coastguard Worker
535*3ac0a46fSAndroid Build Coastguard Worker grand_child = FPDFBookmark_GetFirstChild(document(), sibling);
536*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(grand_child);
537*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(46u, FPDFBookmark_GetTitle(grand_child, buf, sizeof(buf)));
538*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"Open Middle Descendant", GetPlatformWString(buf));
539*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFBookmark_GetCount(grand_child));
540*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFBookmark_GetDest(document(), grand_child));
541*3ac0a46fSAndroid Build Coastguard Worker
542*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_GetNextSibling(document(), grand_child));
543*3ac0a46fSAndroid Build Coastguard Worker }
544*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,FindBookmarks)545*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, FindBookmarks) {
546*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
547*3ac0a46fSAndroid Build Coastguard Worker
548*3ac0a46fSAndroid Build Coastguard Worker // Open a file with many bookmarks.
549*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bookmarks.pdf"));
550*3ac0a46fSAndroid Build Coastguard Worker
551*3ac0a46fSAndroid Build Coastguard Worker // Find the first one, based on its known title.
552*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"A Good Beginning");
553*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOKMARK child = FPDFBookmark_Find(document(), title.get());
554*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(child);
555*3ac0a46fSAndroid Build Coastguard Worker
556*3ac0a46fSAndroid Build Coastguard Worker // Check that the string matches.
557*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(34u, FPDFBookmark_GetTitle(child, buf, sizeof(buf)));
558*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"A Good Beginning", GetPlatformWString(buf));
559*3ac0a46fSAndroid Build Coastguard Worker
560*3ac0a46fSAndroid Build Coastguard Worker // Check that it is them same as the one returned by GetFirstChild.
561*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(child, FPDFBookmark_GetFirstChild(document(), nullptr));
562*3ac0a46fSAndroid Build Coastguard Worker
563*3ac0a46fSAndroid Build Coastguard Worker // Try to find one using a non-existent title.
564*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString bad_title = GetFPDFWideString(L"A BAD Beginning");
565*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(document(), bad_title.get()));
566*3ac0a46fSAndroid Build Coastguard Worker }
567*3ac0a46fSAndroid Build Coastguard Worker
568*3ac0a46fSAndroid Build Coastguard Worker // Check circular bookmarks will not cause infinite loop.
TEST_F(FPDFDocEmbedderTest,FindBookmarks_bug420)569*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, FindBookmarks_bug420) {
570*3ac0a46fSAndroid Build Coastguard Worker // Open a file with circular bookmarks.
571*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bookmarks_circular.pdf"));
572*3ac0a46fSAndroid Build Coastguard Worker
573*3ac0a46fSAndroid Build Coastguard Worker // Try to find a title.
574*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"anything");
575*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(document(), title.get()));
576*3ac0a46fSAndroid Build Coastguard Worker }
577*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,DeletePage)578*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, DeletePage) {
579*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
580*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDF_GetPageCount(document()));
581*3ac0a46fSAndroid Build Coastguard Worker
582*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_Delete(nullptr, 0);
583*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDF_GetPageCount(document()));
584*3ac0a46fSAndroid Build Coastguard Worker
585*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_Delete(document(), -1);
586*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDF_GetPageCount(document()));
587*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_Delete(document(), 1);
588*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDF_GetPageCount(document()));
589*3ac0a46fSAndroid Build Coastguard Worker
590*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_Delete(document(), 0);
591*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDF_GetPageCount(document()));
592*3ac0a46fSAndroid Build Coastguard Worker }
593*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetFileIdentifier)594*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetFileIdentifier) {
595*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("split_streams.pdf"));
596*3ac0a46fSAndroid Build Coastguard Worker constexpr size_t kMd5Length = 17;
597*3ac0a46fSAndroid Build Coastguard Worker char buf[kMd5Length];
598*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u,
599*3ac0a46fSAndroid Build Coastguard Worker FPDF_GetFileIdentifier(document(), static_cast<FPDF_FILEIDTYPE>(-1),
600*3ac0a46fSAndroid Build Coastguard Worker buf, sizeof(buf)));
601*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u,
602*3ac0a46fSAndroid Build Coastguard Worker FPDF_GetFileIdentifier(document(), static_cast<FPDF_FILEIDTYPE>(2),
603*3ac0a46fSAndroid Build Coastguard Worker buf, sizeof(buf)));
604*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDF_GetFileIdentifier(nullptr, FILEIDTYPE_PERMANENT, buf,
605*3ac0a46fSAndroid Build Coastguard Worker sizeof(buf)));
606*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kMd5Length, FPDF_GetFileIdentifier(document(), FILEIDTYPE_PERMANENT,
607*3ac0a46fSAndroid Build Coastguard Worker nullptr, 0));
608*3ac0a46fSAndroid Build Coastguard Worker
609*3ac0a46fSAndroid Build Coastguard Worker constexpr char kExpectedPermanent[] =
610*3ac0a46fSAndroid Build Coastguard Worker "\xF3\x41\xAE\x65\x4A\x77\xAC\xD5\x06\x5A\x76\x45\xE5\x96\xE6\xE6";
611*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kMd5Length, FPDF_GetFileIdentifier(document(), FILEIDTYPE_PERMANENT,
612*3ac0a46fSAndroid Build Coastguard Worker buf, sizeof(buf)));
613*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedPermanent, ByteString(buf));
614*3ac0a46fSAndroid Build Coastguard Worker
615*3ac0a46fSAndroid Build Coastguard Worker constexpr char kExpectedChanging[] =
616*3ac0a46fSAndroid Build Coastguard Worker "\xBC\x37\x29\x8A\x3F\x87\xF4\x79\x22\x9B\xCE\x99\x7C\xA7\x91\xF7";
617*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kMd5Length, FPDF_GetFileIdentifier(document(), FILEIDTYPE_CHANGING,
618*3ac0a46fSAndroid Build Coastguard Worker buf, sizeof(buf)));
619*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedChanging, ByteString(buf));
620*3ac0a46fSAndroid Build Coastguard Worker }
621*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetNonHexFileIdentifier)622*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetNonHexFileIdentifier) {
623*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("non_hex_file_id.pdf"));
624*3ac0a46fSAndroid Build Coastguard Worker char buf[18];
625*3ac0a46fSAndroid Build Coastguard Worker
626*3ac0a46fSAndroid Build Coastguard Worker constexpr char kPermanentNonHex[] = "permanent non-hex";
627*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(18u, FPDF_GetFileIdentifier(document(), FILEIDTYPE_PERMANENT, buf,
628*3ac0a46fSAndroid Build Coastguard Worker sizeof(buf)));
629*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kPermanentNonHex, ByteString(buf));
630*3ac0a46fSAndroid Build Coastguard Worker
631*3ac0a46fSAndroid Build Coastguard Worker constexpr char kChangingNonHex[] = "changing non-hex";
632*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(17u, FPDF_GetFileIdentifier(document(), FILEIDTYPE_CHANGING, buf,
633*3ac0a46fSAndroid Build Coastguard Worker sizeof(buf)));
634*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kChangingNonHex, ByteString(buf));
635*3ac0a46fSAndroid Build Coastguard Worker }
636*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetNonexistentFileIdentifier)637*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetNonexistentFileIdentifier) {
638*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
639*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(
640*3ac0a46fSAndroid Build Coastguard Worker 0u, FPDF_GetFileIdentifier(document(), FILEIDTYPE_PERMANENT, nullptr, 0));
641*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(
642*3ac0a46fSAndroid Build Coastguard Worker 0u, FPDF_GetFileIdentifier(document(), FILEIDTYPE_CHANGING, nullptr, 0));
643*3ac0a46fSAndroid Build Coastguard Worker }
644*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetMetaText)645*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetMetaText) {
646*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_601362.pdf"));
647*3ac0a46fSAndroid Build Coastguard Worker
648*3ac0a46fSAndroid Build Coastguard Worker // Invalid document / tag results in 0.
649*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
650*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDF_GetMetaText(document(), nullptr, buf, sizeof(buf)));
651*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDF_GetMetaText(nullptr, "", buf, sizeof(buf)));
652*3ac0a46fSAndroid Build Coastguard Worker
653*3ac0a46fSAndroid Build Coastguard Worker // Tags that do not eixst results in an empty wide string.
654*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(2u, FPDF_GetMetaText(document(), "", buf, sizeof(buf)));
655*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(2u, FPDF_GetMetaText(document(), "foo", buf, sizeof(buf)));
656*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetMetaText(document(), "Title", buf, sizeof(buf)));
657*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetMetaText(document(), "Author", buf, sizeof(buf)));
658*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetMetaText(document(), "Subject", buf, sizeof(buf)));
659*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetMetaText(document(), "Keywords", buf, sizeof(buf)));
660*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetMetaText(document(), "Producer", buf, sizeof(buf)));
661*3ac0a46fSAndroid Build Coastguard Worker
662*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(30u, FPDF_GetMetaText(document(), "Creator", buf, sizeof(buf)));
663*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"Microsoft Word", GetPlatformWString(buf));
664*3ac0a46fSAndroid Build Coastguard Worker
665*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(48u,
666*3ac0a46fSAndroid Build Coastguard Worker FPDF_GetMetaText(document(), "CreationDate", buf, sizeof(buf)));
667*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"D:20160411190039+00'00'", GetPlatformWString(buf));
668*3ac0a46fSAndroid Build Coastguard Worker
669*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(48u, FPDF_GetMetaText(document(), "ModDate", buf, sizeof(buf)));
670*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"D:20160411190039+00'00'", GetPlatformWString(buf));
671*3ac0a46fSAndroid Build Coastguard Worker }
672*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,Bug_182)673*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, Bug_182) {
674*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_182.pdf"));
675*3ac0a46fSAndroid Build Coastguard Worker
676*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
677*3ac0a46fSAndroid Build Coastguard Worker
678*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(48u, FPDF_GetMetaText(document(), "Title", buf, sizeof(buf)));
679*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"Super Visual Formade 印刷", GetPlatformWString(buf));
680*3ac0a46fSAndroid Build Coastguard Worker }
681*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetMetaTextSameObjectNumber)682*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetMetaTextSameObjectNumber) {
683*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("annotation_highlight_square_with_ap.pdf"));
684*3ac0a46fSAndroid Build Coastguard Worker
685*3ac0a46fSAndroid Build Coastguard Worker // The PDF has been edited. It has two %%EOF markers, and 2 objects numbered
686*3ac0a46fSAndroid Build Coastguard Worker // (1 0). Both objects are /Info dictionaries, but contain different data.
687*3ac0a46fSAndroid Build Coastguard Worker // Make sure ModDate is the date of the last modification.
688*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
689*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(48u, FPDF_GetMetaText(document(), "ModDate", buf, sizeof(buf)));
690*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"D:20170612232940-04'00'", GetPlatformWString(buf));
691*3ac0a46fSAndroid Build Coastguard Worker }
692*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetMetaTextInAttachmentFile)693*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetMetaTextInAttachmentFile) {
694*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("embedded_attachments.pdf"));
695*3ac0a46fSAndroid Build Coastguard Worker
696*3ac0a46fSAndroid Build Coastguard Worker // Make sure this is the date from the PDF itself and not the attached PDF.
697*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
698*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(48u, FPDF_GetMetaText(document(), "ModDate", buf, sizeof(buf)));
699*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"D:20170712214448-07'00'", GetPlatformWString(buf));
700*3ac0a46fSAndroid Build Coastguard Worker }
701*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetMetaTextFromNewDocument)702*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetMetaTextFromNewDocument) {
703*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT empty_doc = FPDF_CreateNewDocument();
704*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
705*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(2u, FPDF_GetMetaText(empty_doc, "Title", buf, sizeof(buf)));
706*3ac0a46fSAndroid Build Coastguard Worker FPDF_CloseDocument(empty_doc);
707*3ac0a46fSAndroid Build Coastguard Worker }
708*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetPageAAction)709*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetPageAAction) {
710*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("get_page_aaction.pdf"));
711*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page = LoadPage(0);
712*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(page);
713*3ac0a46fSAndroid Build Coastguard Worker
714*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDF_GetPageAAction(nullptr, FPDFPAGE_AACTION_OPEN));
715*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDF_GetPageAAction(page, FPDFPAGE_AACTION_CLOSE));
716*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDF_GetPageAAction(page, -1));
717*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDF_GetPageAAction(page, 999));
718*3ac0a46fSAndroid Build Coastguard Worker
719*3ac0a46fSAndroid Build Coastguard Worker FPDF_ACTION action = FPDF_GetPageAAction(page, FPDFPAGE_AACTION_OPEN);
720*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned long>(PDFACTION_EMBEDDEDGOTO),
721*3ac0a46fSAndroid Build Coastguard Worker FPDFAction_GetType(action));
722*3ac0a46fSAndroid Build Coastguard Worker
723*3ac0a46fSAndroid Build Coastguard Worker const char kExpectedResult[] = "\\\\127.0.0.1\\c$\\Program Files\\test.exe";
724*3ac0a46fSAndroid Build Coastguard Worker const unsigned long kExpectedLength = sizeof(kExpectedResult);
725*3ac0a46fSAndroid Build Coastguard Worker char buf[1024];
726*3ac0a46fSAndroid Build Coastguard Worker
727*3ac0a46fSAndroid Build Coastguard Worker unsigned long bufsize = FPDFAction_GetFilePath(action, nullptr, 0);
728*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, bufsize);
729*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFAction_GetFilePath(action, buf, bufsize));
730*3ac0a46fSAndroid Build Coastguard Worker EXPECT_STREQ(kExpectedResult, buf);
731*3ac0a46fSAndroid Build Coastguard Worker
732*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
733*3ac0a46fSAndroid Build Coastguard Worker
734*3ac0a46fSAndroid Build Coastguard Worker page = LoadPage(1);
735*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(page);
736*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDF_GetPageAAction(page, -1));
737*3ac0a46fSAndroid Build Coastguard Worker
738*3ac0a46fSAndroid Build Coastguard Worker UnloadPage(page);
739*3ac0a46fSAndroid Build Coastguard Worker }
740*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,NoPageLabels)741*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, NoPageLabels) {
742*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("about_blank.pdf"));
743*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDF_GetPageCount(document()));
744*3ac0a46fSAndroid Build Coastguard Worker
745*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 0, nullptr, 0));
746*3ac0a46fSAndroid Build Coastguard Worker }
747*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFDocEmbedderTest,GetPageLabels)748*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetPageLabels) {
749*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("page_labels.pdf"));
750*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(7, FPDF_GetPageCount(document()));
751*3ac0a46fSAndroid Build Coastguard Worker
752*3ac0a46fSAndroid Build Coastguard Worker // We do not request labels, when use FPDFAvail_IsXXXAvail.
753*3ac0a46fSAndroid Build Coastguard Worker // Flush all data, to allow read labels.
754*3ac0a46fSAndroid Build Coastguard Worker SetWholeFileAvailable();
755*3ac0a46fSAndroid Build Coastguard Worker
756*3ac0a46fSAndroid Build Coastguard Worker unsigned short buf[128];
757*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDF_GetPageLabel(document(), -2, buf, sizeof(buf)));
758*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDF_GetPageLabel(document(), -1, buf, sizeof(buf)));
759*3ac0a46fSAndroid Build Coastguard Worker
760*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 0, buf, sizeof(buf)));
761*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"i", GetPlatformWString(buf));
762*3ac0a46fSAndroid Build Coastguard Worker
763*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(6u, FPDF_GetPageLabel(document(), 1, buf, sizeof(buf)));
764*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"ii", GetPlatformWString(buf));
765*3ac0a46fSAndroid Build Coastguard Worker
766*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 2, buf, sizeof(buf)));
767*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"1", GetPlatformWString(buf));
768*3ac0a46fSAndroid Build Coastguard Worker
769*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 3, buf, sizeof(buf)));
770*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"2", GetPlatformWString(buf));
771*3ac0a46fSAndroid Build Coastguard Worker
772*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(8u, FPDF_GetPageLabel(document(), 4, buf, sizeof(buf)));
773*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"zzA", GetPlatformWString(buf));
774*3ac0a46fSAndroid Build Coastguard Worker
775*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(8u, FPDF_GetPageLabel(document(), 5, buf, sizeof(buf)));
776*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"zzB", GetPlatformWString(buf));
777*3ac0a46fSAndroid Build Coastguard Worker
778*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(2u, FPDF_GetPageLabel(document(), 6, buf, sizeof(buf)));
779*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"", GetPlatformWString(buf));
780*3ac0a46fSAndroid Build Coastguard Worker
781*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 7, buf, sizeof(buf)));
782*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 8, buf, sizeof(buf)));
783*3ac0a46fSAndroid Build Coastguard Worker }
784*3ac0a46fSAndroid Build Coastguard Worker
785*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
TEST_F(FPDFDocEmbedderTest,GetXFALinks)786*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFDocEmbedderTest, GetXFALinks) {
787*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
788*3ac0a46fSAndroid Build Coastguard Worker
789*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFPage page(FPDF_LoadPage(document(), 0));
790*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(page);
791*3ac0a46fSAndroid Build Coastguard Worker
792*3ac0a46fSAndroid Build Coastguard Worker FPDFLink_GetLinkAtPoint(page.get(), 150, 360);
793*3ac0a46fSAndroid Build Coastguard Worker FPDFLink_GetLinkAtPoint(page.get(), 150, 420);
794*3ac0a46fSAndroid Build Coastguard Worker
795*3ac0a46fSAndroid Build Coastguard Worker // Test passes if it doesn't crash. See https://crbug.com/840922
796*3ac0a46fSAndroid Build Coastguard Worker }
797*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
798