TEST_F(FPDFStructTreeEmbedderTest, GetType) { ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); { ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page)); ASSERT_TRUE(struct_tree); ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get())); FPDF_STRUCTELEMENT element = FPDF_StructTree_GetChildAtIndex(struct_tree.get(), 0); ASSERT_NE(nullptr, element); unsigned short buffer[12]; memset(buffer, 0, sizeof(buffer)); // Deliberately pass in a small buffer size to make sure |buffer| remains // untouched. ASSERT_EQ(18U, FPDF_StructElement_GetType(element, buffer, 1)); for (size_t i = 0; i < FX_ArraySize(buffer); ++i) EXPECT_EQ(0U, buffer[i]); ASSERT_EQ(18U, FPDF_StructElement_GetType(element, buffer, sizeof(buffer))); const wchar_t kExpected[] = L"Document"; EXPECT_EQ(WideString(kExpected), WideString::FromUTF16LE(buffer, FXSYS_len(kExpected))); } UnloadPage(page); }
TEST_F(FPDFParserEmbeddertest, Bug_481363) { // Test colorspace object with malformed dictionary. EXPECT_TRUE(OpenDocument("testing/resources/bug_481363.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); UnloadPage(page); }
TEST_F(FPDFDocEmbedderTest, ActionURI) { EXPECT_TRUE(OpenDocument("uri_action.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); // The target action is nearly the size of the whole page. FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100); ASSERT_TRUE(link); FPDF_ACTION action = FPDFLink_GetAction(link); ASSERT_TRUE(action); EXPECT_EQ(static_cast<unsigned long>(PDFACTION_URI), FPDFAction_GetType(action)); const char kExpectedResult[] = "https://example.com/page.html"; const unsigned long kExpectedLength = sizeof(kExpectedResult); unsigned long bufsize = FPDFAction_GetURIPath(document(), action, nullptr, 0); ASSERT_EQ(kExpectedLength, bufsize); char buf[1024]; EXPECT_EQ(bufsize, FPDFAction_GetURIPath(document(), action, buf, bufsize)); EXPECT_STREQ(kExpectedResult, buf); // Other public methods are not appropriate for URI actions EXPECT_EQ(nullptr, FPDFAction_GetDest(document(), action)); EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf))); UnloadPage(page); }
TEST_F(FXGETextEmbedderTest, BadItalic) { // Shouldn't crash. EXPECT_TRUE(OpenDocument("bug_601362.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_BITMAP bitmap = RenderPage(page); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
TEST_F(FPDFViewEmbeddertest, Page) { EXPECT_TRUE(OpenDocument("about_blank.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); EXPECT_EQ(612.0, FPDF_GetPageWidth(page)); EXPECT_EQ(792.0, FPDF_GetPageHeight(page)); UnloadPage(page); EXPECT_EQ(nullptr, LoadPage(1)); }
TEST_F(FXCodecEmbedderTest, Bug_631912) { // Test jbig2 image in PDF file can be loaded successfully. // Should not crash. EXPECT_TRUE(OpenDocument("bug_631912.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); ScopedFPDFBitmap bitmap = RenderLoadedPage(page); CompareBitmap(bitmap.get(), 691, 432, "24d75af646f8772c5ee7ced260452ae4"); UnloadPage(page); }
TEST_F(FXCodecEmbeddertest, Bug_631912) { // Test jbig2 image in PDF file can be loaded successfully. // Should not crash. EXPECT_TRUE(OpenDocument("bug_631912.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_BITMAP bitmap = RenderPage(page); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_603518) { // Should not crash EXPECT_TRUE(OpenDocument("bug_603518.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_BITMAP bitmap = RenderPage(page); CompareBitmap(bitmap, 749, 749, "b9e75190cdc5edf0069a408744ca07dc"); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_557223) { // Should not crash EXPECT_TRUE(OpenDocument("bug_557223.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_BITMAP bitmap = RenderPage(page); CompareBitmap(bitmap, 24, 24, "dc0ea1b743c2edb22c597cadc8537f7b"); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_554151) { // Test scanline downsampling with a BitsPerComponent of 4. // Should not crash. EXPECT_TRUE(OpenDocument("bug_554151.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_BITMAP bitmap = RenderPage(page); CompareBitmap(bitmap, 612, 792, "a14d7ee573c1b2456d7bf6b7762823cf"); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
// Test that the page has characters despite a bad stream length. TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { EXPECT_TRUE(OpenDocument("testing/resources/bug_57.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_NE(nullptr, textpage); EXPECT_EQ(13, FPDFText_CountChars(textpage)); FPDFText_ClosePage(textpage); UnloadPage(page); }
TEST_F(FPDFTextEmbeddertest, ToUnicode) { EXPECT_TRUE(OpenDocument("bug_583.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_TRUE(page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_TRUE(textpage); ASSERT_EQ(1, FPDFText_CountChars(textpage)); EXPECT_EQ(static_cast<unsigned int>(0), FPDFText_GetUnicode(textpage, 0)); FPDFText_ClosePage(textpage); UnloadPage(page); }
TEST_F(FPDFViewEmbeddertest, FPDF_RenderPageBitmapWithMatrix) { const char kAllBlackMd5sum[] = "5708fc5c4a8bd0abde99c8e8f0390615"; const char kTopLeftQuarterBlackMd5sum[] = "24e4d1ec06fa0258af758cfc8b2ad50a"; EXPECT_TRUE(OpenDocument("black.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); const int width = static_cast<int>(FPDF_GetPageWidth(page)); const int height = static_cast<int>(FPDF_GetPageHeight(page)); EXPECT_EQ(612, width); EXPECT_EQ(792, height); FPDF_BITMAP bitmap = RenderPage(page); CompareBitmap(bitmap, width, height, kAllBlackMd5sum); FPDFBitmap_Destroy(bitmap); // Try rendering with an identity matrix. The output should be the same as // the RenderPage() output. FS_MATRIX matrix; matrix.a = 1; matrix.b = 0; matrix.c = 0; matrix.d = 1; matrix.e = 0; matrix.f = 0; FS_RECTF rect; rect.left = 0; rect.top = 0; rect.right = width; rect.bottom = height; bitmap = FPDFBitmap_Create(width, height, 0); FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); FPDF_RenderPageBitmapWithMatrix(bitmap, page, &matrix, &rect, 0); CompareBitmap(bitmap, width, height, kAllBlackMd5sum); FPDFBitmap_Destroy(bitmap); // Now render again with the image scaled. matrix.a = 0.5; matrix.d = 0.5; bitmap = FPDFBitmap_Create(width, height, 0); FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); FPDF_RenderPageBitmapWithMatrix(bitmap, page, &matrix, &rect, 0); CompareBitmap(bitmap, width, height, kTopLeftQuarterBlackMd5sum); FPDFBitmap_Destroy(bitmap); UnloadPage(page); }
TEST_F(CPDFSecurityHandlerEmbedderTest, PasswordAfterGenerateSave) { #if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_ const char md5[] = "7048dca58e2ed8f93339008b91e4eb4e"; #elif _FX_PLATFORM_ == _FX_PLATFORM_APPLE_ const char md5[] = "6951b6c9891dfe0332a5b1983e484400"; #else const char md5[] = "041c2fb541c8907cc22ce101b686c79e"; #endif // _FX_PLATFORM_ == _FX_PLATFORM_LINUX_ { ASSERT_TRUE(OpenDocumentWithOptions("encrypted.pdf", "5678", LinearizeOption::kMustLinearize, JavaScriptOption::kEnableJavaScript)); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(10, 10, 20, 20); ASSERT_TRUE(red_rect); EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 0, 0, 255)); EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); FPDFPage_InsertObject(page, red_rect); ScopedFPDFBitmap bitmap = RenderLoadedPage(page); CompareBitmap(bitmap.get(), 612, 792, md5); EXPECT_TRUE(FPDFPage_GenerateContent(page)); SetWholeFileAvailable(); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); UnloadPage(page); } std::string new_file = GetString(); FPDF_FILEACCESS file_access; memset(&file_access, 0, sizeof(file_access)); file_access.m_FileLen = new_file.size(); file_access.m_GetBlock = GetBlockFromString; file_access.m_Param = &new_file; EXPECT_FALSE(FPDF_LoadCustomDocument(&file_access, nullptr)); struct { const char* password; const unsigned long permissions; } tests[] = {{"1234", 0xFFFFF2C0}, {"5678", 0xFFFFFFFC}}; for (const auto& test : tests) { OpenSavedDocument(test.password); FPDF_PAGE page = LoadSavedPage(0); VerifySavedRendering(page, 612, 792, md5); EXPECT_EQ(test.permissions, FPDF_GetDocPermissions(saved_document_)); CloseSavedPage(page); CloseSavedDocument(); } }
TEST_F(FPDFStructTreeEmbedderTest, GetMarkedContentID) { ASSERT_TRUE(OpenDocument("marked_content_id.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); { ScopedFPDFStructTree struct_tree(FPDF_StructTree_GetForPage(page)); ASSERT_TRUE(struct_tree); ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree.get())); FPDF_STRUCTELEMENT element = FPDF_StructTree_GetChildAtIndex(struct_tree.get(), 0); EXPECT_EQ(0, FPDF_StructElement_GetMarkedContentID(element)); } UnloadPage(page); }
TEST_F(FPDFTextEmbeddertest, GetFontSize) { EXPECT_TRUE(OpenDocument("hello_world.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_TRUE(page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_TRUE(textpage); const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; int count = FPDFText_CountChars(textpage); ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast<size_t>(count)); for (int i = 0; i < count; ++i) EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; FPDFText_ClosePage(textpage); UnloadPage(page); }
TEST_F(FPDFDocEmbedderTest, ActionNonesuch) { EXPECT_TRUE(OpenDocument("nonesuch_action.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); // The target action is nearly the size of the whole page. FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100); ASSERT_TRUE(link); FPDF_ACTION action = FPDFLink_GetAction(link); ASSERT_TRUE(action); EXPECT_EQ(static_cast<unsigned long>(PDFACTION_UNSUPPORTED), FPDFAction_GetType(action)); // No public methods are appropriate for unsupported actions. char buf[1024]; EXPECT_FALSE(FPDFAction_GetDest(document(), action)); EXPECT_EQ(0u, FPDFAction_GetFilePath(action, buf, sizeof(buf))); EXPECT_EQ(0u, FPDFAction_GetURIPath(document(), action, buf, sizeof(buf))); UnloadPage(page); }
TEST_F(FPDFTextEmbeddertest, Text) { EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_NE(nullptr, textpage); static const char expected[] = "Hello, world!\r\nGoodbye, world!"; unsigned short fixed_buffer[128]; memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); // Check includes the terminating NUL that is provided. int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); ASSERT_GE(num_chars, 0); EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); // Count does not include the terminating NUL in the string literal. EXPECT_EQ(sizeof(expected) - 1, FPDFText_CountChars(textpage)); for (size_t i = 0; i < sizeof(expected) - 1; ++i) { EXPECT_EQ(static_cast<unsigned int>(expected[i]), FPDFText_GetUnicode(textpage, i)) << " at " << i; } EXPECT_EQ(12.0, FPDFText_GetFontSize(textpage, 0)); EXPECT_EQ(16.0, FPDFText_GetFontSize(textpage, 15)); double left = 0.0; double right = 0.0; double bottom = 0.0; double top = 0.0; FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); EXPECT_NEAR(41.071, left, 0.001); EXPECT_NEAR(46.243, right, 0.001); EXPECT_NEAR(49.844, bottom, 0.001); EXPECT_NEAR(55.520, top, 0.001); EXPECT_EQ(4, FPDFText_GetCharIndexAtPos(textpage, 42.0, 50.0, 1.0, 1.0)); EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 0.0, 0.0, 1.0, 1.0)); EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 199.0, 199.0, 1.0, 1.0)); // Test out of range indicies. EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 42.0, 10000000.0, 1.0, 1.0)); EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, -1.0, 50.0, 1.0, 1.0)); // Count does not include the terminating NUL in the string literal. EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); left = 0.0; right = 0.0; bottom = 0.0; top = 0.0; FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); EXPECT_NEAR(20.847, left, 0.001); EXPECT_NEAR(135.167, right, 0.001); EXPECT_NEAR(96.655, bottom, 0.001); EXPECT_NEAR(116.000, top, 0.001); // Test out of range indicies set outputs to (0.0, 0.0, 0.0, 0.0). left = -1.0; right = -1.0; bottom = -1.0; top = -1.0; FPDFText_GetRect(textpage, -1, &left, &top, &right, &bottom); EXPECT_EQ(0.0, left); EXPECT_EQ(0.0, right); EXPECT_EQ(0.0, bottom); EXPECT_EQ(0.0, top); left = -2.0; right = -2.0; bottom = -2.0; top = -2.0; FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); EXPECT_EQ(0.0, left); EXPECT_EQ(0.0, right); EXPECT_EQ(0.0, bottom); EXPECT_EQ(0.0, top); EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); // Extract starting at character 4 as above. memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(1, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 1)); EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); EXPECT_EQ(0xbdbd, fixed_buffer[1]); memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 9)); EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); EXPECT_EQ(0xbdbd, fixed_buffer[9]); memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 128)); EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); EXPECT_EQ(0u, fixed_buffer[9]); EXPECT_EQ(0xbdbd, fixed_buffer[10]); FPDFText_ClosePage(textpage); UnloadPage(page); }
TEST_F(FPDFTextEmbeddertest, WebLinks) { EXPECT_TRUE(OpenDocument("testing/resources/weblinks.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_NE(nullptr, textpage); FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); EXPECT_NE(nullptr, pagelink); // Page contains two HTTP-style URLs. EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); // Only a terminating NUL required for bogus links. EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); // Query the number of characters required for each link (incl NUL). EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 0, nullptr, 0)); EXPECT_EQ(26, FPDFLink_GetURL(pagelink, 1, nullptr, 0)); static const char expected_url[] = "http://example.com?q=foo"; unsigned short fixed_buffer[128]; // Retrieve a link with too small a buffer. Buffer will not be // NUL-terminated, but must not be modified past indicated length, // so pre-fill with a pattern to check write bounds. memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); EXPECT_EQ(0xbdbd, fixed_buffer[1]); // Check buffer that doesn't have space for a terminating NUL. memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ( sizeof(expected_url) - 1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url) - 1)); EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); // Retreive link with exactly-sized buffer. memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url))); EXPECT_TRUE( check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); // Retreive link with ample-sized-buffer. memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128)); EXPECT_TRUE( check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); // Each link rendered in a single rect in this test page. EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); // Each link rendered in a single rect in this test page. EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 10000)); // Check boundary of valid link index with valid rect index. double left = 0.0; double right = 0.0; double top = 0.0; double bottom = 0.0; FPDFLink_GetRect(pagelink, 0, 0, &left, &top, &right, &bottom); EXPECT_NEAR(50.791, left, 0.001); EXPECT_NEAR(187.963, right, 0.001); EXPECT_NEAR(97.624, bottom, 0.001); EXPECT_NEAR(108.736, top, 0.001); // Check that valid link with invalid rect index leaves parameters unchanged. left = -1.0; right = -1.0; top = -1.0; bottom = -1.0; FPDFLink_GetRect(pagelink, 0, 1, &left, &top, &right, &bottom); EXPECT_EQ(-1.0, left); EXPECT_EQ(-1.0, right); EXPECT_EQ(-1.0, bottom); EXPECT_EQ(-1.0, top); // Check that invalid link index leaves parameters unchanged. left = -2.0; right = -2.0; top = -2.0; bottom = -2.0; FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); EXPECT_EQ(-2.0, left); EXPECT_EQ(-2.0, right); EXPECT_EQ(-2.0, bottom); EXPECT_EQ(-2.0, top); FPDFLink_CloseWebLinks(pagelink); FPDFText_ClosePage(textpage); UnloadPage(page); }
void TearDown() override { UnloadPage(GetPage()); EmbedderTest::TearDown(); }
TEST_F(FPDFTextEmbeddertest, TextSearch) { EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_NE(nullptr, textpage); // Avoid issues with system wchar_t width vs. FPDF_WideString. const unsigned short nope[] = {'n', 'o', 'p', 'e', '\0'}; const unsigned short world[] = {'w', 'o', 'r', 'l', 'd', '\0'}; const unsigned short world_caps[] = {'W', 'O', 'R', 'L', 'D', '\0'}; const unsigned short world_substr[] = {'o', 'r', 'l', 'd', '\0'}; // No occurences of "nope" in test page. FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope, 0, 0); EXPECT_NE(nullptr, search); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // Advancing finds nothing. EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // Retreating finds nothing. EXPECT_FALSE(FPDFText_FindPrev(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Two occurences of "world" in test page. search = FPDFText_FindStart(textpage, world, 0, 2); EXPECT_NE(nullptr, search); // Remains not found until advanced. EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // First occurence of "world" in this test page. EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Last occurence of "world" in this test page. EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Found position unchanged when fails to advance. EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Back to first occurence. EXPECT_TRUE(FPDFText_FindPrev(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Found position unchanged when fails to retreat. EXPECT_FALSE(FPDFText_FindPrev(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Exact search unaffected by case sensitiity and whole word flags. search = FPDFText_FindStart(textpage, world, FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); EXPECT_NE(nullptr, search); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Default is case-insensitive, so matching agaist caps works. search = FPDFText_FindStart(textpage, world_caps, 0, 0); EXPECT_NE(nullptr, search); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // But can be made case sensitive, in which case this fails. search = FPDFText_FindStart(textpage, world_caps, FPDF_MATCHCASE, 0); EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Default is match anywhere within word, so matching substirng works. search = FPDFText_FindStart(textpage, world_substr, 0, 0); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(8, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(4, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // But can be made to mach word boundaries, in which case this fails. search = FPDFText_FindStart(textpage, world_substr, FPDF_MATCHWHOLEWORD, 0); EXPECT_FALSE(FPDFText_FindNext(search)); // TODO(tsepez): investigate strange index/count values in this state. FPDFText_FindClose(search); FPDFText_ClosePage(textpage); UnloadPage(page); }
TEST_F(FPDFViewEmbeddertest, Crasher_452455) { EXPECT_TRUE(OpenDocument("bug_452455.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); UnloadPage(page); }
TEST_F(FPDFDocEmbedderTest, BUG_821454) { EXPECT_TRUE(OpenDocument("bug_821454.pdf")); FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); // Cover some NULL arg cases while we're at it. EXPECT_FALSE(FPDFLink_GetLinkAtPoint(nullptr, 150, 360)); EXPECT_EQ(-1, FPDFLink_GetLinkZOrderAtPoint(nullptr, 150, 360)); FPDF_LINK link1 = FPDFLink_GetLinkAtPoint(page, 150, 360); ASSERT_TRUE(link1); FPDF_LINK link2 = FPDFLink_GetLinkAtPoint(page, 150, 420); ASSERT_TRUE(link2); EXPECT_EQ(0, FPDFLink_GetLinkZOrderAtPoint(page, 150, 360)); EXPECT_EQ(1, FPDFLink_GetLinkZOrderAtPoint(page, 150, 420)); FPDF_DEST dest1 = FPDFLink_GetDest(document(), link1); ASSERT_TRUE(dest1); FPDF_DEST dest2 = FPDFLink_GetDest(document(), link2); ASSERT_TRUE(dest2); EXPECT_EQ(0, FPDFDest_GetDestPageIndex(document(), dest1)); EXPECT_EQ(0, FPDFDest_GetDestPageIndex(document(), dest2)); { FPDF_BOOL has_x_coord; FPDF_BOOL has_y_coord; FPDF_BOOL has_zoom; FS_FLOAT x; FS_FLOAT y; FS_FLOAT zoom; FPDF_BOOL success = FPDFDest_GetLocationInPage( dest1, &has_x_coord, &has_y_coord, &has_zoom, &x, &y, &zoom); ASSERT_TRUE(success); EXPECT_TRUE(has_x_coord); EXPECT_TRUE(has_y_coord); EXPECT_FALSE(has_zoom); EXPECT_FLOAT_EQ(100.0f, x); EXPECT_FLOAT_EQ(200.0f, y); } { FPDF_BOOL has_x_coord; FPDF_BOOL has_y_coord; FPDF_BOOL has_zoom; FS_FLOAT x; FS_FLOAT y; FS_FLOAT zoom; FPDF_BOOL success = FPDFDest_GetLocationInPage( dest2, &has_x_coord, &has_y_coord, &has_zoom, &x, &y, &zoom); ASSERT_TRUE(success); EXPECT_TRUE(has_x_coord); EXPECT_TRUE(has_y_coord); EXPECT_FALSE(has_zoom); EXPECT_FLOAT_EQ(150.0f, x); EXPECT_FLOAT_EQ(250.0f, y); } UnloadPage(page); }
TEST_F(XFAParserImpEmbeddertest, Bug_216) { EXPECT_TRUE(OpenDocument("bug_216.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_NE(nullptr, page); UnloadPage(page); }
TEST_F(FSDKBaseFormEmbeddertest, CBA_AnnotIterator) { EXPECT_TRUE(OpenDocument("annotiter.pdf")); FPDF_PAGE page0 = LoadPage(0); FPDF_PAGE page1 = LoadPage(1); FPDF_PAGE page2 = LoadPage(2); EXPECT_TRUE(page0); EXPECT_TRUE(page1); EXPECT_TRUE(page2); CFX_FloatRect LeftBottom(200, 200, 220, 220); CFX_FloatRect RightBottom(400, 201, 420, 221); CFX_FloatRect LeftTop(201, 400, 221, 420); CFX_FloatRect RightTop(401, 401, 421, 421); CPDFSDK_FormFillEnvironment* pFormFillEnv = static_cast<CPDFSDK_FormFillEnvironment*>(form_handle()); { // Page 0 specifies "row order". CBA_AnnotIterator iter(pFormFillEnv->GetPageView(0), CPDF_Annot::Subtype::WIDGET); CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetNextAnnot(pAnnot); EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); pAnnot = iter.GetLastAnnot(); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetPrevAnnot(pAnnot); EXPECT_EQ(iter.GetLastAnnot(), pAnnot); } { // Page 1 specifies "column order" CBA_AnnotIterator iter(pFormFillEnv->GetPageView(1), CPDF_Annot::Subtype::WIDGET); CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetNextAnnot(pAnnot); EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); pAnnot = iter.GetLastAnnot(); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetPrevAnnot(pAnnot); EXPECT_EQ(iter.GetLastAnnot(), pAnnot); } { // Page 2 specifies "struct order" CBA_AnnotIterator iter(pFormFillEnv->GetPageView(2), CPDF_Annot::Subtype::WIDGET); CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetNextAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetNextAnnot(pAnnot); EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); pAnnot = iter.GetLastAnnot(); CheckRect(pAnnot->GetRect(), RightBottom); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftTop); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), RightTop); pAnnot = iter.GetPrevAnnot(pAnnot); CheckRect(pAnnot->GetRect(), LeftBottom); pAnnot = iter.GetPrevAnnot(pAnnot); EXPECT_EQ(iter.GetLastAnnot(), pAnnot); } UnloadPage(page2); UnloadPage(page1); UnloadPage(page0); }
TEST_F(FPDFTextEmbeddertest, TextSearch) { EXPECT_TRUE(OpenDocument("hello_world.pdf")); FPDF_PAGE page = LoadPage(0); EXPECT_TRUE(page); FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); EXPECT_TRUE(textpage); std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = GetFPDFWideString(L"nope"); std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = GetFPDFWideString(L"world"); std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = GetFPDFWideString(L"WORLD"); std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = GetFPDFWideString(L"orld"); // No occurences of "nope" in test page. FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); EXPECT_TRUE(search); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // Advancing finds nothing. EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // Retreating finds nothing. EXPECT_FALSE(FPDFText_FindPrev(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Two occurences of "world" in test page. search = FPDFText_FindStart(textpage, world.get(), 0, 2); EXPECT_TRUE(search); // Remains not found until advanced. EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); // First occurence of "world" in this test page. EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Last occurence of "world" in this test page. EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Found position unchanged when fails to advance. EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Back to first occurence. EXPECT_TRUE(FPDFText_FindPrev(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); // Found position unchanged when fails to retreat. EXPECT_FALSE(FPDFText_FindPrev(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Exact search unaffected by case sensitiity and whole word flags. search = FPDFText_FindStart(textpage, world.get(), FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); EXPECT_TRUE(search); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Default is case-insensitive, so matching agaist caps works. search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); EXPECT_TRUE(search); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(5, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // But can be made case sensitive, in which case this fails. search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); EXPECT_FALSE(FPDFText_FindNext(search)); EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(0, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // Default is match anywhere within word, so matching substirng works. search = FPDFText_FindStart(textpage, world_substr.get(), 0, 0); EXPECT_TRUE(FPDFText_FindNext(search)); EXPECT_EQ(8, FPDFText_GetSchResultIndex(search)); EXPECT_EQ(4, FPDFText_GetSchCount(search)); FPDFText_FindClose(search); // But can be made to mach word boundaries, in which case this fails. search = FPDFText_FindStart(textpage, world_substr.get(), FPDF_MATCHWHOLEWORD, 0); EXPECT_FALSE(FPDFText_FindNext(search)); // TODO(tsepez): investigate strange index/count values in this state. FPDFText_FindClose(search); FPDFText_ClosePage(textpage); UnloadPage(page); }