| OLD | NEW |
| 1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "../../public/fpdf_text.h" | 5 #include "../../public/fpdf_text.h" |
| 6 #include "../../public/fpdfview.h" | 6 #include "../../public/fpdfview.h" |
| 7 #include "../../testing/embedder_test.h" | 7 #include "../../testing/embedder_test.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace { | 10 namespace { |
| 11 | 11 |
| 12 static bool check_unsigned_shorts(const char* expected, | 12 static bool check_unsigned_shorts(const char* expected, |
| 13 const unsigned short* actual, | 13 const unsigned short* actual, |
| 14 size_t length) { | 14 size_t length) { |
| 15 if (length > strlen(expected) + 1) { | 15 if (length > strlen(expected) + 1) { |
| 16 return false; | 16 return false; |
| 17 } | 17 } |
| 18 for (size_t i = 0; i < length; ++i) { | 18 for (size_t i = 0; i < length; ++i) { |
| 19 if (actual[i] != static_cast<unsigned short>(expected[i])) { | 19 if (actual[i] != static_cast<unsigned short>(expected[i])) { |
| 20 return false; | 20 return false; |
| 21 } | 21 } |
| 22 } | 22 } |
| 23 return true; | 23 return true; |
| 24 } | 24 } |
| 25 | 25 |
| 26 } // namespace | 26 } // namespace |
| 27 | 27 |
| 28 class FPDFTextEmbeddertest : public EmbedderTest { | 28 class FPDFTextEmbeddertest : public EmbedderTest {}; |
| 29 }; | |
| 30 | 29 |
| 31 TEST_F(FPDFTextEmbeddertest, Text) { | 30 TEST_F(FPDFTextEmbeddertest, Text) { |
| 32 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); | 31 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); |
| 33 FPDF_PAGE page = LoadPage(0); | 32 FPDF_PAGE page = LoadPage(0); |
| 34 EXPECT_NE(nullptr, page); | 33 EXPECT_NE(nullptr, page); |
| 35 | 34 |
| 36 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 35 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 37 EXPECT_NE(nullptr, textpage); | 36 EXPECT_NE(nullptr, textpage); |
| 38 | 37 |
| 39 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; | 38 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 56 double left = 0.0; | 55 double left = 0.0; |
| 57 double right = 0.0; | 56 double right = 0.0; |
| 58 double bottom = 0.0; | 57 double bottom = 0.0; |
| 59 double top = 0.0; | 58 double top = 0.0; |
| 60 FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); | 59 FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); |
| 61 EXPECT_NEAR(41.071, left, 0.001); | 60 EXPECT_NEAR(41.071, left, 0.001); |
| 62 EXPECT_NEAR(46.243, right, 0.001); | 61 EXPECT_NEAR(46.243, right, 0.001); |
| 63 EXPECT_NEAR(49.844, bottom, 0.001); | 62 EXPECT_NEAR(49.844, bottom, 0.001); |
| 64 EXPECT_NEAR(55.520, top, 0.001); | 63 EXPECT_NEAR(55.520, top, 0.001); |
| 65 | 64 |
| 66 EXPECT_EQ(4, FPDFText_GetCharIndexAtPos( | 65 EXPECT_EQ(4, FPDFText_GetCharIndexAtPos(textpage, 42.0, 50.0, 1.0, 1.0)); |
| 67 textpage, 42.0, 50.0, 1.0, 1.0)); | 66 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 0.0, 0.0, 1.0, 1.0)); |
| 68 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 67 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 199.0, 199.0, 1.0, 1.0)); |
| 69 textpage, 0.0, 0.0, 1.0, 1.0)); | |
| 70 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | |
| 71 textpage, 199.0, 199.0, 1.0, 1.0)); | |
| 72 | 68 |
| 73 // Test out of range indicies. | 69 // Test out of range indicies. |
| 74 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 70 EXPECT_EQ(-1, |
| 75 textpage, 42.0, 10000000.0, 1.0, 1.0)); | 71 FPDFText_GetCharIndexAtPos(textpage, 42.0, 10000000.0, 1.0, 1.0)); |
| 76 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 72 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, -1.0, 50.0, 1.0, 1.0)); |
| 77 textpage, -1.0, 50.0, 1.0, 1.0)); | |
| 78 | 73 |
| 79 // Count does not include the terminating NUL in the string literal. | 74 // Count does not include the terminating NUL in the string literal. |
| 80 EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); | 75 EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); |
| 81 | 76 |
| 82 left = 0.0; | 77 left = 0.0; |
| 83 right = 0.0; | 78 right = 0.0; |
| 84 bottom = 0.0; | 79 bottom = 0.0; |
| 85 top = 0.0; | 80 top = 0.0; |
| 86 FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); | 81 FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); |
| 87 EXPECT_NEAR(20.847, left, 0.001); | 82 EXPECT_NEAR(20.847, left, 0.001); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 103 left = -2.0; | 98 left = -2.0; |
| 104 right = -2.0; | 99 right = -2.0; |
| 105 bottom = -2.0; | 100 bottom = -2.0; |
| 106 top = -2.0; | 101 top = -2.0; |
| 107 FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); | 102 FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); |
| 108 EXPECT_EQ(0.0, left); | 103 EXPECT_EQ(0.0, left); |
| 109 EXPECT_EQ(0.0, right); | 104 EXPECT_EQ(0.0, right); |
| 110 EXPECT_EQ(0.0, bottom); | 105 EXPECT_EQ(0.0, bottom); |
| 111 EXPECT_EQ(0.0, top); | 106 EXPECT_EQ(0.0, top); |
| 112 | 107 |
| 113 EXPECT_EQ(9, FPDFText_GetBoundedText( | 108 EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); |
| 114 textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); | |
| 115 | 109 |
| 116 // Extract starting at character 4 as above. | 110 // Extract starting at character 4 as above. |
| 117 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 111 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 118 EXPECT_EQ(1, FPDFText_GetBoundedText( | 112 EXPECT_EQ(1, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
| 119 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 1)); | 113 fixed_buffer, 1)); |
| 120 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); | 114 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); |
| 121 EXPECT_EQ(0xbdbd, fixed_buffer[1]); | 115 EXPECT_EQ(0xbdbd, fixed_buffer[1]); |
| 122 | 116 |
| 123 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 117 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 124 EXPECT_EQ(9, FPDFText_GetBoundedText( | 118 EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
| 125 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 9)); | 119 fixed_buffer, 9)); |
| 126 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); | 120 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); |
| 127 EXPECT_EQ(0xbdbd, fixed_buffer[9]); | 121 EXPECT_EQ(0xbdbd, fixed_buffer[9]); |
| 128 | 122 |
| 129 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 123 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 130 EXPECT_EQ(10, FPDFText_GetBoundedText( | 124 EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
| 131 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 128)); | 125 fixed_buffer, 128)); |
| 132 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); | 126 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); |
| 133 EXPECT_EQ(0u, fixed_buffer[9]); | 127 EXPECT_EQ(0u, fixed_buffer[9]); |
| 134 EXPECT_EQ(0xbdbd, fixed_buffer[10]); | 128 EXPECT_EQ(0xbdbd, fixed_buffer[10]); |
| 135 | 129 |
| 136 FPDFText_ClosePage(textpage); | 130 FPDFText_ClosePage(textpage); |
| 137 UnloadPage(page); | 131 UnloadPage(page); |
| 138 } | 132 } |
| 139 | 133 |
| 140 TEST_F(FPDFTextEmbeddertest, TextSearch) { | 134 TEST_F(FPDFTextEmbeddertest, TextSearch) { |
| 141 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); | 135 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); |
| 142 FPDF_PAGE page = LoadPage(0); | 136 FPDF_PAGE page = LoadPage(0); |
| 143 EXPECT_NE(nullptr, page); | 137 EXPECT_NE(nullptr, page); |
| 144 | 138 |
| 145 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 139 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 146 EXPECT_NE(nullptr, textpage); | 140 EXPECT_NE(nullptr, textpage); |
| 147 | 141 |
| 148 // Avoid issues with system wchar_t width vs. FPDF_WideString. | 142 // Avoid issues with system wchar_t width vs. FPDF_WideString. |
| 149 const unsigned short nope[] = { 'n', 'o', 'p', 'e', '\0' }; | 143 const unsigned short nope[] = {'n', 'o', 'p', 'e', '\0'}; |
| 150 const unsigned short world[] = { 'w', 'o', 'r', 'l', 'd', '\0' }; | 144 const unsigned short world[] = {'w', 'o', 'r', 'l', 'd', '\0'}; |
| 151 const unsigned short world_caps[] = { 'W', 'O', 'R', 'L', 'D', '\0' }; | 145 const unsigned short world_caps[] = {'W', 'O', 'R', 'L', 'D', '\0'}; |
| 152 const unsigned short world_substr[] = { 'o', 'r', 'l', 'd', '\0' }; | 146 const unsigned short world_substr[] = {'o', 'r', 'l', 'd', '\0'}; |
| 153 | 147 |
| 154 // No occurences of "nope" in test page. | 148 // No occurences of "nope" in test page. |
| 155 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope, 0, 0); | 149 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope, 0, 0); |
| 156 EXPECT_NE(nullptr, search); | 150 EXPECT_NE(nullptr, search); |
| 157 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 151 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 158 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 152 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| 159 | 153 |
| 160 // Advancing finds nothing. | 154 // Advancing finds nothing. |
| 161 EXPECT_FALSE(FPDFText_FindNext(search)); | 155 EXPECT_FALSE(FPDFText_FindNext(search)); |
| 162 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 156 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 190 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 197 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 191 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 198 | 192 |
| 199 // Found position unchanged when fails to retreat. | 193 // Found position unchanged when fails to retreat. |
| 200 EXPECT_FALSE(FPDFText_FindPrev(search)); | 194 EXPECT_FALSE(FPDFText_FindPrev(search)); |
| 201 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 195 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 202 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 196 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 203 FPDFText_FindClose(search); | 197 FPDFText_FindClose(search); |
| 204 | 198 |
| 205 // Exact search unaffected by case sensitiity and whole word flags. | 199 // Exact search unaffected by case sensitiity and whole word flags. |
| 206 search = FPDFText_FindStart( | 200 search = FPDFText_FindStart(textpage, world, |
| 207 textpage, world, FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); | 201 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); |
| 208 EXPECT_NE(nullptr, search); | 202 EXPECT_NE(nullptr, search); |
| 209 EXPECT_TRUE(FPDFText_FindNext(search)); | 203 EXPECT_TRUE(FPDFText_FindNext(search)); |
| 210 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 204 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 211 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 205 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 212 FPDFText_FindClose(search); | 206 FPDFText_FindClose(search); |
| 213 | 207 |
| 214 // Default is case-insensitive, so matching agaist caps works. | 208 // Default is case-insensitive, so matching agaist caps works. |
| 215 search = FPDFText_FindStart(textpage, world_caps, 0, 0); | 209 search = FPDFText_FindStart(textpage, world_caps, 0, 0); |
| 216 EXPECT_NE(nullptr, search); | 210 EXPECT_NE(nullptr, search); |
| 217 EXPECT_TRUE(FPDFText_FindNext(search)); | 211 EXPECT_TRUE(FPDFText_FindNext(search)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 // Retrieve a link with too small a buffer. Buffer will not be | 280 // Retrieve a link with too small a buffer. Buffer will not be |
| 287 // NUL-terminated, but must not be modified past indicated length, | 281 // NUL-terminated, but must not be modified past indicated length, |
| 288 // so pre-fill with a pattern to check write bounds. | 282 // so pre-fill with a pattern to check write bounds. |
| 289 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 283 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 290 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); | 284 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); |
| 291 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); | 285 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); |
| 292 EXPECT_EQ(0xbdbd, fixed_buffer[1]); | 286 EXPECT_EQ(0xbdbd, fixed_buffer[1]); |
| 293 | 287 |
| 294 // Check buffer that doesn't have space for a terminating NUL. | 288 // Check buffer that doesn't have space for a terminating NUL. |
| 295 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 289 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 296 EXPECT_EQ(sizeof(expected_url) - 1, FPDFLink_GetURL( | 290 EXPECT_EQ( |
| 297 pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); | 291 sizeof(expected_url) - 1, |
| 298 EXPECT_TRUE(check_unsigned_shorts( | 292 FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); |
| 299 expected_url, fixed_buffer, sizeof(expected_url) - 1)); | 293 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, |
| 294 sizeof(expected_url) - 1)); |
| 300 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); | 295 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); |
| 301 | 296 |
| 302 // Retreive link with exactly-sized buffer. | 297 // Retreive link with exactly-sized buffer. |
| 303 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 298 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 304 EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL( | 299 EXPECT_EQ(sizeof(expected_url), |
| 305 pagelink, 0, fixed_buffer, sizeof(expected_url))); | 300 FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url))); |
| 306 EXPECT_TRUE(check_unsigned_shorts( | 301 EXPECT_TRUE( |
| 307 expected_url, fixed_buffer, sizeof(expected_url))); | 302 check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); |
| 308 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); | 303 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); |
| 309 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); | 304 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); |
| 310 | 305 |
| 311 // Retreive link with ample-sized-buffer. | 306 // Retreive link with ample-sized-buffer. |
| 312 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 307 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 313 EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL( | 308 EXPECT_EQ(sizeof(expected_url), |
| 314 pagelink, 0, fixed_buffer, 128)); | 309 FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128)); |
| 315 EXPECT_TRUE(check_unsigned_shorts( | 310 EXPECT_TRUE( |
| 316 expected_url, fixed_buffer, sizeof(expected_url))); | 311 check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); |
| 317 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); | 312 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); |
| 318 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); | 313 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); |
| 319 | 314 |
| 320 // Each link rendered in a single rect in this test page. | 315 // Each link rendered in a single rect in this test page. |
| 321 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); | 316 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); |
| 322 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); | 317 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); |
| 323 | 318 |
| 324 // Each link rendered in a single rect in this test page. | 319 // Each link rendered in a single rect in this test page. |
| 325 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); | 320 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); |
| 326 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); | 321 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 356 FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); | 351 FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); |
| 357 EXPECT_EQ(-2.0, left); | 352 EXPECT_EQ(-2.0, left); |
| 358 EXPECT_EQ(-2.0, right); | 353 EXPECT_EQ(-2.0, right); |
| 359 EXPECT_EQ(-2.0, bottom); | 354 EXPECT_EQ(-2.0, bottom); |
| 360 EXPECT_EQ(-2.0, top); | 355 EXPECT_EQ(-2.0, top); |
| 361 | 356 |
| 362 FPDFLink_CloseWebLinks(pagelink); | 357 FPDFLink_CloseWebLinks(pagelink); |
| 363 FPDFText_ClosePage(textpage); | 358 FPDFText_ClosePage(textpage); |
| 364 UnloadPage(page); | 359 UnloadPage(page); |
| 365 } | 360 } |
| OLD | NEW |