diff options
-rw-r--r-- | fpdfsdk/src/fpdfdoc_embeddertest.cpp | 38 | ||||
-rw-r--r-- | fpdfsdk/src/fpdfview_embeddertest.cpp | 37 | ||||
-rw-r--r-- | pdfium.gyp | 1 | ||||
-rw-r--r-- | testing/resources/named_dests.in | 82 | ||||
-rw-r--r-- | testing/resources/named_dests.pdf | 108 |
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 |