summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpdfsdk/src/fpdfdoc_embeddertest.cpp38
-rw-r--r--fpdfsdk/src/fpdfview_embeddertest.cpp37
-rw-r--r--pdfium.gyp1
-rw-r--r--testing/resources/named_dests.in82
-rw-r--r--testing/resources/named_dests.pdf108
5 files changed, 215 insertions, 51 deletions
diff --git a/fpdfsdk/src/fpdfdoc_embeddertest.cpp b/fpdfsdk/src/fpdfdoc_embeddertest.cpp
new file mode 100644
index 0000000000..dadaf1d809
--- /dev/null
+++ b/fpdfsdk/src/fpdfdoc_embeddertest.cpp
@@ -0,0 +1,38 @@
+// Copyright 2015 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "../../testing/embedder_test.h"
+#include "../../fpdfsdk/include/fpdfview.h"
+#include "../../fpdfsdk/include/fpdfdoc.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class FPDFDocEmbeddertest : public EmbedderTest {
+};
+
+TEST_F(FPDFDocEmbeddertest, DestGetPageIndex) {
+ EXPECT_TRUE(OpenDocument("testing/resources/named_dests.pdf"));
+
+ // NULL FPDF_DEST case.
+ EXPECT_EQ(0, FPDFDest_GetPageIndex(document(), nullptr));
+
+ // Page number directly in item from Dests NameTree.
+ FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
+ EXPECT_NE(nullptr, dest);
+ EXPECT_EQ(1, FPDFDest_GetPageIndex(document(), dest));
+
+ // Page number via object reference in item from Dests NameTree.
+ dest = FPDF_GetNamedDestByName(document(), "Next");
+ EXPECT_NE(nullptr, dest);
+ EXPECT_EQ(1, FPDFDest_GetPageIndex(document(), dest));
+
+ // Page number directly in item from Dests dictionary.
+ dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
+ EXPECT_NE(nullptr, dest);
+ EXPECT_EQ(11, FPDFDest_GetPageIndex(document(), dest));
+
+ // Invalid object reference in item from Dests NameTree.
+ dest = FPDF_GetNamedDestByName(document(), "LastAlternate");
+ EXPECT_NE(nullptr, dest);
+ EXPECT_EQ(0, FPDFDest_GetPageIndex(document(), dest));
+}
diff --git a/fpdfsdk/src/fpdfview_embeddertest.cpp b/fpdfsdk/src/fpdfview_embeddertest.cpp
index 55c159a42c..ee32727ace 100644
--- a/fpdfsdk/src/fpdfview_embeddertest.cpp
+++ b/fpdfsdk/src/fpdfview_embeddertest.cpp
@@ -140,3 +140,40 @@ TEST_F(FPDFViewEmbeddertest, NamedDests) {
EXPECT_EQ(nullptr, dest);
EXPECT_EQ(sizeof(fixed_buffer), buffer_size); // unmodified.
}
+
+TEST_F(FPDFViewEmbeddertest, NamedDestsByName) {
+ EXPECT_TRUE(OpenDocument("testing/resources/named_dests.pdf"));
+
+ // Null pointer returns NULL.
+ FPDF_DEST dest = FPDF_GetNamedDestByName(document(), nullptr);
+ EXPECT_EQ(nullptr, dest);
+
+ // Empty string returns NULL.
+ dest = FPDF_GetNamedDestByName(document(), "");
+ EXPECT_EQ(nullptr, dest);
+
+ // Item from Dests NameTree.
+ dest = FPDF_GetNamedDestByName(document(), "First");
+ EXPECT_NE(nullptr, dest);
+
+ long ignore_len = 0;
+ FPDF_DEST dest_by_index =
+ FPDF_GetNamedDest(document(), 0, nullptr, ignore_len);
+ EXPECT_EQ(dest_by_index, dest);
+
+ // Item from Dests dictionary.
+ dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
+ EXPECT_NE(nullptr, dest);
+
+ ignore_len = 0;
+ dest_by_index = FPDF_GetNamedDest(document(), 4, nullptr, ignore_len);
+ EXPECT_EQ(dest_by_index, dest);
+
+ // Bad value type for item from Dests NameTree array.
+ dest = FPDF_GetNamedDestByName(document(), "WrongType");
+ EXPECT_EQ(nullptr, dest);
+
+ // No such destination in either Dest NameTree or dictionary.
+ dest = FPDF_GetNamedDestByName(document(), "Bogus");
+ EXPECT_EQ(nullptr, dest);
+}
diff --git a/pdfium.gyp b/pdfium.gyp
index b454573492..2125852360 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -839,6 +839,7 @@
'<(DEPTH)'
],
'sources': [
+ 'fpdfsdk/src/fpdfdoc_embeddertest.cpp',
'fpdfsdk/src/fpdfview_embeddertest.cpp',
'testing/embedder_test.cpp',
'testing/embedder_test.h',
diff --git a/testing/resources/named_dests.in b/testing/resources/named_dests.in
index 6655be9d1b..5309ee23aa 100644
--- a/testing/resources/named_dests.in
+++ b/testing/resources/named_dests.in
@@ -1,34 +1,43 @@
{{header}}
{{object 1 0}} <<
- /Type /Pages
- /Count 1
- /Kids [3 0 R]
->>
-endobj
-{{object 2 0}} <<
/Type /Catalog
- /Pages 1 0 R
+ /Pages 2 0 R
/Names <<
/Dests 10 0 R
>>
/Dests 14 0 R
>>
endobj
+{{object 2 0}} <<
+ /Type /Pages
+ /Count 2
+ /Kids [
+ 3 0 R
+ 4 0 R
+ ]
+>>
+endobj
+% Page number 0.
{{object 3 0}} <<
/Type /Page
- /Parent 1 0 R
+ /Parent 2 0 R
/Resources <<
- /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
+ /Font <</F1 15 0 R>>
>>
+ /Contents [21 0 R]
/MediaBox [0 0 612 792]
- /Contents 5 0 R
>>
endobj
-{{object 5 0}} <<
- /Length 18
->> stream
-1 0 0 -1 29 763 cm
-endstream
+% Page number 1.
+{{object 4 0}} <<
+ /Type /Page
+ /Parent 2 0 R
+ /Resources <<
+ /Font <</F1 15 0 R>>
+ >>
+ /Contents [22 0 R]
+ /MediaBox [0 0 612 792]
+>>
endobj
% Root of Dests NameTree
{{object 10 0}} <<
@@ -41,8 +50,8 @@ endobj
% Left child for Dests NameTree
{{object 11 0}} <<
/Names [
- (First) [0 /XYZ 0 0 1]
- (Next) <</D [4 /Fit]>>
+ (First) [1 /XYZ 0 0 1]
+ (Next) <</D [4 0 R /Fit]>>
]
>>
endobj
@@ -54,16 +63,47 @@ endobj
]
>>
endobj
-% Old-style top-level Dests dictionary.
+% Old-style top-level Dests dictionary. Note that FirstAlternate
+% intentionally references non-exisstant page 11 and LastAlternate
+% intentionally references non-existant object 999.
{{object 14 0}} <<
- /FirstAlternate [10 /XYZ 200 400 800]
- /LastAlternate <</D [14 /XYZ 0 0 -200]>>
+ /FirstAlternate [11 /XYZ 200 400 800]
+ /LastAlternate <</D [999 0 R /XYZ 0 0 -200]>>
>>
endobj
+% Font resource.
+{{object 15 0}} <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Arial
+>>
+endobj
+% Content for page 0.
+{{object 21 0}} <<
+ /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page1)Tj
+ET
+endstream
+endobj
+% Content for page 1.
+{{object 22 0}} <<
+ /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page2)Tj
+ET
+endstream
+endobj
{{xref}}
trailer <<
/Size 6
- /Root 2 0 R
+ /Root 1 0 R
>>
{{startxref}}
%%EOF
diff --git a/testing/resources/named_dests.pdf b/testing/resources/named_dests.pdf
index 1f650e7865..e302c196d6 100644
--- a/testing/resources/named_dests.pdf
+++ b/testing/resources/named_dests.pdf
@@ -1,35 +1,44 @@
%PDF-1.7
% ò¤ô
1 0 obj <<
- /Type /Pages
- /Count 1
- /Kids [3 0 R]
->>
-endobj
-2 0 obj <<
/Type /Catalog
- /Pages 1 0 R
+ /Pages 2 0 R
/Names <<
/Dests 10 0 R
>>
/Dests 14 0 R
>>
endobj
+2 0 obj <<
+ /Type /Pages
+ /Count 2
+ /Kids [
+ 3 0 R
+ 4 0 R
+ ]
+>>
+endobj
+% Page number 0.
3 0 obj <<
/Type /Page
- /Parent 1 0 R
+ /Parent 2 0 R
/Resources <<
- /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
+ /Font <</F1 15 0 R>>
>>
+ /Contents [21 0 R]
/MediaBox [0 0 612 792]
- /Contents 5 0 R
>>
endobj
-5 0 obj <<
- /Length 18
->> stream
-1 0 0 -1 29 763 cm
-endstream
+% Page number 1.
+4 0 obj <<
+ /Type /Page
+ /Parent 2 0 R
+ /Resources <<
+ /Font <</F1 15 0 R>>
+ >>
+ /Contents [22 0 R]
+ /MediaBox [0 0 612 792]
+>>
endobj
% Root of Dests NameTree
10 0 obj <<
@@ -42,8 +51,8 @@ endobj
% Left child for Dests NameTree
11 0 obj <<
/Names [
- (First) [0 /XYZ 0 0 1]
- (Next) <</D [4 /Fit]>>
+ (First) [1 /XYZ 0 0 1]
+ (Next) <</D [4 0 R /Fit]>>
]
>>
endobj
@@ -55,33 +64,72 @@ endobj
]
>>
endobj
-% Old-style top-level Dests dictionary.
+% Old-style top-level Dests dictionary. Note that FirstAlternate
+% intentionally references non-exisstant page 11 and LastAlternate
+% intentionally references non-existant object 999.
14 0 obj <<
- /FirstAlternate [10 /XYZ 200 400 800]
- /LastAlternate <</D [14 /XYZ 0 0 -200]>>
+ /FirstAlternate [11 /XYZ 200 400 800]
+ /LastAlternate <</D [999 0 R /XYZ 0 0 -200]>>
+>>
+endobj
+% Font resource.
+15 0 obj <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Arial
+>>
+endobj
+% Content for page 0.
+21 0 obj <<
+ /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page1)Tj
+ET
+endstream
+endobj
+% Content for page 1.
+22 0 obj <<
+ /Length 0
>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page2)Tj
+ET
+endstream
endobj
xref
-0 15
+0 23
0000000000 65536 f
0000000015 00000 n
-0000000078 00000 n
-0000000182 00000 n
+0000000119 00000 n
+0000000217 00000 n
+0000000378 00000 n
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000548 00000 n
+0000000638 00000 n
+0000000766 00000 n
0000000000 65536 f
-0000000349 00000 n
+0000001060 00000 n
+0000001188 00000 n
0000000000 65536 f
0000000000 65536 f
0000000000 65536 f
0000000000 65536 f
-0000000444 00000 n
-0000000534 00000 n
-0000000658 00000 n
0000000000 65536 f
-0000000808 00000 n
+0000001283 00000 n
+0000001393 00000 n
trailer <<
/Size 6
- /Root 2 0 R
+ /Root 1 0 R
>>
startxref
-914
+1481
%%EOF