1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 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 "public/fpdf_doc.h"
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
8*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
9*3ac0a46fSAndroid Build Coastguard Worker
10*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/test_with_page_module.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_array.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_dictionary.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_name.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_null.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_number.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_parser.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_reference.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_string.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_test_document.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_dest.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "public/cpp/fpdf_scopers.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fx_string_testhelpers.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
26*3ac0a46fSAndroid Build Coastguard Worker
27*3ac0a46fSAndroid Build Coastguard Worker class PDFDocTest : public TestWithPageModule {
28*3ac0a46fSAndroid Build Coastguard Worker public:
29*3ac0a46fSAndroid Build Coastguard Worker struct DictObjInfo {
30*3ac0a46fSAndroid Build Coastguard Worker uint32_t num;
31*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> obj;
32*3ac0a46fSAndroid Build Coastguard Worker };
33*3ac0a46fSAndroid Build Coastguard Worker
SetUp()34*3ac0a46fSAndroid Build Coastguard Worker void SetUp() override {
35*3ac0a46fSAndroid Build Coastguard Worker TestWithPageModule::SetUp();
36*3ac0a46fSAndroid Build Coastguard Worker auto pTestDoc = std::make_unique<CPDF_TestDocument>();
37*3ac0a46fSAndroid Build Coastguard Worker m_pIndirectObjs = pTestDoc.get();
38*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj = m_pIndirectObjs->NewIndirect<CPDF_Dictionary>();
39*3ac0a46fSAndroid Build Coastguard Worker pTestDoc->SetRoot(m_pRootObj);
40*3ac0a46fSAndroid Build Coastguard Worker m_pDoc.reset(FPDFDocumentFromCPDFDocument(pTestDoc.release()));
41*3ac0a46fSAndroid Build Coastguard Worker }
42*3ac0a46fSAndroid Build Coastguard Worker
TearDown()43*3ac0a46fSAndroid Build Coastguard Worker void TearDown() override {
44*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj = nullptr;
45*3ac0a46fSAndroid Build Coastguard Worker m_pIndirectObjs = nullptr;
46*3ac0a46fSAndroid Build Coastguard Worker m_pDoc.reset();
47*3ac0a46fSAndroid Build Coastguard Worker TestWithPageModule::TearDown();
48*3ac0a46fSAndroid Build Coastguard Worker }
49*3ac0a46fSAndroid Build Coastguard Worker
CreateDictObjs(int num)50*3ac0a46fSAndroid Build Coastguard Worker std::vector<DictObjInfo> CreateDictObjs(int num) {
51*3ac0a46fSAndroid Build Coastguard Worker std::vector<DictObjInfo> info;
52*3ac0a46fSAndroid Build Coastguard Worker for (int i = 0; i < num; ++i) {
53*3ac0a46fSAndroid Build Coastguard Worker auto obj = m_pIndirectObjs->NewIndirect<CPDF_Dictionary>();
54*3ac0a46fSAndroid Build Coastguard Worker info.push_back({obj->GetObjNum(), obj});
55*3ac0a46fSAndroid Build Coastguard Worker }
56*3ac0a46fSAndroid Build Coastguard Worker return info;
57*3ac0a46fSAndroid Build Coastguard Worker }
58*3ac0a46fSAndroid Build Coastguard Worker
59*3ac0a46fSAndroid Build Coastguard Worker protected:
60*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFDocument m_pDoc;
61*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPDF_IndirectObjectHolder> m_pIndirectObjs;
62*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> m_pRootObj;
63*3ac0a46fSAndroid Build Coastguard Worker };
64*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(PDFDocTest,FindBookmark)65*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFDocTest, FindBookmark) {
66*3ac0a46fSAndroid Build Coastguard Worker {
67*3ac0a46fSAndroid Build Coastguard Worker // No bookmark information.
68*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"");
69*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
70*3ac0a46fSAndroid Build Coastguard Worker
71*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Preface");
72*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
73*3ac0a46fSAndroid Build Coastguard Worker }
74*3ac0a46fSAndroid Build Coastguard Worker {
75*3ac0a46fSAndroid Build Coastguard Worker // Empty bookmark tree.
76*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj->SetNewFor<CPDF_Dictionary>("Outlines");
77*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"");
78*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
79*3ac0a46fSAndroid Build Coastguard Worker
80*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Preface");
81*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
82*3ac0a46fSAndroid Build Coastguard Worker }
83*3ac0a46fSAndroid Build Coastguard Worker {
84*3ac0a46fSAndroid Build Coastguard Worker // Check on a regular bookmark tree.
85*3ac0a46fSAndroid Build Coastguard Worker auto bookmarks = CreateDictObjs(3);
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_String>("Title", L"Chapter 1");
88*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
89*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
90*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("Next", m_pIndirectObjs,
91*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
92*3ac0a46fSAndroid Build Coastguard Worker
93*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_String>("Title", L"Chapter 2");
94*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
95*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
96*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("Prev", m_pIndirectObjs,
97*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
98*3ac0a46fSAndroid Build Coastguard Worker
99*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Name>("Type", "Outlines");
100*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Number>("Count", 2);
101*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("First", m_pIndirectObjs,
102*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
103*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("Last", m_pIndirectObjs,
104*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
105*3ac0a46fSAndroid Build Coastguard Worker
106*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj->SetNewFor<CPDF_Reference>("Outlines", m_pIndirectObjs,
107*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
108*3ac0a46fSAndroid Build Coastguard Worker
109*3ac0a46fSAndroid Build Coastguard Worker // Title with no match.
110*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"Chapter 3");
111*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker // Title with partial match only.
114*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Chapter");
115*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
116*3ac0a46fSAndroid Build Coastguard Worker
117*3ac0a46fSAndroid Build Coastguard Worker // Title with a match.
118*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Chapter 2");
119*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDFBookmarkFromCPDFDictionary(bookmarks[2].obj.Get()),
120*3ac0a46fSAndroid Build Coastguard Worker FPDFBookmark_Find(m_pDoc.get(), title.get()));
121*3ac0a46fSAndroid Build Coastguard Worker
122*3ac0a46fSAndroid Build Coastguard Worker // Title match is case insensitive.
123*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"cHaPter 2");
124*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDFBookmarkFromCPDFDictionary(bookmarks[2].obj.Get()),
125*3ac0a46fSAndroid Build Coastguard Worker FPDFBookmark_Find(m_pDoc.get(), title.get()));
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker {
128*3ac0a46fSAndroid Build Coastguard Worker // Circular bookmarks in depth.
129*3ac0a46fSAndroid Build Coastguard Worker auto bookmarks = CreateDictObjs(3);
130*3ac0a46fSAndroid Build Coastguard Worker
131*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_String>("Title", L"Chapter 1");
132*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
133*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
134*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("First", m_pIndirectObjs,
135*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
136*3ac0a46fSAndroid Build Coastguard Worker
137*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_String>("Title", L"Chapter 2");
138*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
139*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
140*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("First", m_pIndirectObjs,
141*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
142*3ac0a46fSAndroid Build Coastguard Worker
143*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Name>("Type", "Outlines");
144*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Number>("Count", 2);
145*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("First", m_pIndirectObjs,
146*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
147*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("Last", m_pIndirectObjs,
148*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
149*3ac0a46fSAndroid Build Coastguard Worker
150*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj->SetNewFor<CPDF_Reference>("Outlines", m_pIndirectObjs,
151*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
152*3ac0a46fSAndroid Build Coastguard Worker
153*3ac0a46fSAndroid Build Coastguard Worker // Title with no match.
154*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"Chapter 3");
155*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
156*3ac0a46fSAndroid Build Coastguard Worker
157*3ac0a46fSAndroid Build Coastguard Worker // Title with a match.
158*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Chapter 2");
159*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDFBookmarkFromCPDFDictionary(bookmarks[2].obj.Get()),
160*3ac0a46fSAndroid Build Coastguard Worker FPDFBookmark_Find(m_pDoc.get(), title.get()));
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker {
163*3ac0a46fSAndroid Build Coastguard Worker // Circular bookmarks in breadth.
164*3ac0a46fSAndroid Build Coastguard Worker auto bookmarks = CreateDictObjs(4);
165*3ac0a46fSAndroid Build Coastguard Worker
166*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_String>("Title", L"Chapter 1");
167*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
168*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
169*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].obj->SetNewFor<CPDF_Reference>("Next", m_pIndirectObjs,
170*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
171*3ac0a46fSAndroid Build Coastguard Worker
172*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_String>("Title", L"Chapter 2");
173*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
174*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
175*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].obj->SetNewFor<CPDF_Reference>("Next", m_pIndirectObjs,
176*3ac0a46fSAndroid Build Coastguard Worker bookmarks[3].num);
177*3ac0a46fSAndroid Build Coastguard Worker
178*3ac0a46fSAndroid Build Coastguard Worker bookmarks[3].obj->SetNewFor<CPDF_String>("Title", L"Chapter 3");
179*3ac0a46fSAndroid Build Coastguard Worker bookmarks[3].obj->SetNewFor<CPDF_Reference>("Parent", m_pIndirectObjs,
180*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
181*3ac0a46fSAndroid Build Coastguard Worker bookmarks[3].obj->SetNewFor<CPDF_Reference>("Next", m_pIndirectObjs,
182*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
183*3ac0a46fSAndroid Build Coastguard Worker
184*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Name>("Type", "Outlines");
185*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Number>("Count", 2);
186*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("First", m_pIndirectObjs,
187*3ac0a46fSAndroid Build Coastguard Worker bookmarks[1].num);
188*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].obj->SetNewFor<CPDF_Reference>("Last", m_pIndirectObjs,
189*3ac0a46fSAndroid Build Coastguard Worker bookmarks[2].num);
190*3ac0a46fSAndroid Build Coastguard Worker
191*3ac0a46fSAndroid Build Coastguard Worker m_pRootObj->SetNewFor<CPDF_Reference>("Outlines", m_pIndirectObjs,
192*3ac0a46fSAndroid Build Coastguard Worker bookmarks[0].num);
193*3ac0a46fSAndroid Build Coastguard Worker
194*3ac0a46fSAndroid Build Coastguard Worker // Title with no match.
195*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFWideString title = GetFPDFWideString(L"Chapter 8");
196*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFBookmark_Find(m_pDoc.get(), title.get()));
197*3ac0a46fSAndroid Build Coastguard Worker
198*3ac0a46fSAndroid Build Coastguard Worker // Title with a match.
199*3ac0a46fSAndroid Build Coastguard Worker title = GetFPDFWideString(L"Chapter 3");
200*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(FPDFBookmarkFromCPDFDictionary(bookmarks[3].obj.Get()),
201*3ac0a46fSAndroid Build Coastguard Worker FPDFBookmark_Find(m_pDoc.get(), title.get()));
202*3ac0a46fSAndroid Build Coastguard Worker }
203*3ac0a46fSAndroid Build Coastguard Worker }
204*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(PDFDocTest,GetLocationInPage)205*3ac0a46fSAndroid Build Coastguard Worker TEST_F(PDFDocTest, GetLocationInPage) {
206*3ac0a46fSAndroid Build Coastguard Worker auto array = pdfium::MakeRetain<CPDF_Array>();
207*3ac0a46fSAndroid Build Coastguard Worker array->AppendNew<CPDF_Number>(0); // Page Index.
208*3ac0a46fSAndroid Build Coastguard Worker array->AppendNew<CPDF_Name>("XYZ");
209*3ac0a46fSAndroid Build Coastguard Worker array->AppendNew<CPDF_Number>(4); // X
210*3ac0a46fSAndroid Build Coastguard Worker array->AppendNew<CPDF_Number>(5); // Y
211*3ac0a46fSAndroid Build Coastguard Worker array->AppendNew<CPDF_Number>(6); // Zoom.
212*3ac0a46fSAndroid Build Coastguard Worker
213*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasX;
214*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasY;
215*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL hasZoom;
216*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT x;
217*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT y;
218*3ac0a46fSAndroid Build Coastguard Worker FS_FLOAT zoom;
219*3ac0a46fSAndroid Build Coastguard Worker
220*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFDest_GetLocationInPage(FPDFDestFromCPDFArray(array.Get()),
221*3ac0a46fSAndroid Build Coastguard Worker &hasX, &hasY, &hasZoom, &x, &y,
222*3ac0a46fSAndroid Build Coastguard Worker &zoom));
223*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasX);
224*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasY);
225*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(hasZoom);
226*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(4, x);
227*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(5, y);
228*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(6, zoom);
229*3ac0a46fSAndroid Build Coastguard Worker
230*3ac0a46fSAndroid Build Coastguard Worker array->SetNewAt<CPDF_Null>(2);
231*3ac0a46fSAndroid Build Coastguard Worker array->SetNewAt<CPDF_Null>(3);
232*3ac0a46fSAndroid Build Coastguard Worker array->SetNewAt<CPDF_Null>(4);
233*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(FPDFDest_GetLocationInPage(FPDFDestFromCPDFArray(array.Get()),
234*3ac0a46fSAndroid Build Coastguard Worker &hasX, &hasY, &hasZoom, &x, &y,
235*3ac0a46fSAndroid Build Coastguard Worker &zoom));
236*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(hasX);
237*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(hasY);
238*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(hasZoom);
239*3ac0a46fSAndroid Build Coastguard Worker
240*3ac0a46fSAndroid Build Coastguard Worker array = pdfium::MakeRetain<CPDF_Array>();
241*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(FPDFDest_GetLocationInPage(FPDFDestFromCPDFArray(array.Get()),
242*3ac0a46fSAndroid Build Coastguard Worker &hasX, &hasY, &hasZoom, &x, &y,
243*3ac0a46fSAndroid Build Coastguard Worker &zoom));
244*3ac0a46fSAndroid Build Coastguard Worker }
245