| 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 "core/fxcrt/include/fx_basic.h" | 5 #include "core/fxcrt/include/fx_basic.h" |
| 6 #include "public/fpdf_text.h" | 6 #include "public/fpdf_text.h" |
| 7 #include "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
| 8 #include "testing/embedder_test.h" | 8 #include "testing/embedder_test.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "testing/test_support.h" | 10 #include "testing/test_support.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 return true; | 25 return true; |
| 26 } | 26 } |
| 27 | 27 |
| 28 } // namespace | 28 } // namespace |
| 29 | 29 |
| 30 class FPDFTextEmbeddertest : public EmbedderTest {}; | 30 class FPDFTextEmbeddertest : public EmbedderTest {}; |
| 31 | 31 |
| 32 TEST_F(FPDFTextEmbeddertest, Text) { | 32 TEST_F(FPDFTextEmbeddertest, Text) { |
| 33 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 33 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
| 34 FPDF_PAGE page = LoadPage(0); | 34 FPDF_PAGE page = LoadPage(0); |
| 35 EXPECT_NE(nullptr, page); | 35 EXPECT_TRUE(page); |
| 36 | 36 |
| 37 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 37 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 38 EXPECT_NE(nullptr, textpage); | 38 EXPECT_TRUE(textpage); |
| 39 | 39 |
| 40 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; | 40 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; |
| 41 unsigned short fixed_buffer[128]; | 41 unsigned short fixed_buffer[128]; |
| 42 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 42 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
| 43 | 43 |
| 44 // Check includes the terminating NUL that is provided. | 44 // Check includes the terminating NUL that is provided. |
| 45 int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); | 45 int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); |
| 46 ASSERT_GE(num_chars, 0); | 46 ASSERT_GE(num_chars, 0); |
| 47 EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); | 47 EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); |
| 48 EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); | 48 EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 EXPECT_EQ(0u, fixed_buffer[9]); | 134 EXPECT_EQ(0u, fixed_buffer[9]); |
| 135 EXPECT_EQ(0xbdbd, fixed_buffer[10]); | 135 EXPECT_EQ(0xbdbd, fixed_buffer[10]); |
| 136 | 136 |
| 137 FPDFText_ClosePage(textpage); | 137 FPDFText_ClosePage(textpage); |
| 138 UnloadPage(page); | 138 UnloadPage(page); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST_F(FPDFTextEmbeddertest, TextSearch) { | 141 TEST_F(FPDFTextEmbeddertest, TextSearch) { |
| 142 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 142 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
| 143 FPDF_PAGE page = LoadPage(0); | 143 FPDF_PAGE page = LoadPage(0); |
| 144 EXPECT_NE(nullptr, page); | 144 EXPECT_TRUE(page); |
| 145 | 145 |
| 146 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 146 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 147 EXPECT_NE(nullptr, textpage); | 147 EXPECT_TRUE(textpage); |
| 148 | 148 |
| 149 std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = | 149 std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = |
| 150 GetFPDFWideString(L"nope"); | 150 GetFPDFWideString(L"nope"); |
| 151 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = | 151 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = |
| 152 GetFPDFWideString(L"world"); | 152 GetFPDFWideString(L"world"); |
| 153 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = | 153 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = |
| 154 GetFPDFWideString(L"WORLD"); | 154 GetFPDFWideString(L"WORLD"); |
| 155 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = | 155 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = |
| 156 GetFPDFWideString(L"orld"); | 156 GetFPDFWideString(L"orld"); |
| 157 | 157 |
| 158 // No occurences of "nope" in test page. | 158 // No occurences of "nope" in test page. |
| 159 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); | 159 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); |
| 160 EXPECT_NE(nullptr, search); | 160 EXPECT_TRUE(search); |
| 161 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 161 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 162 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 162 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| 163 | 163 |
| 164 // Advancing finds nothing. | 164 // Advancing finds nothing. |
| 165 EXPECT_FALSE(FPDFText_FindNext(search)); | 165 EXPECT_FALSE(FPDFText_FindNext(search)); |
| 166 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 166 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 167 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 167 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| 168 | 168 |
| 169 // Retreating finds nothing. | 169 // Retreating finds nothing. |
| 170 EXPECT_FALSE(FPDFText_FindPrev(search)); | 170 EXPECT_FALSE(FPDFText_FindPrev(search)); |
| 171 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 171 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 172 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 172 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| 173 FPDFText_FindClose(search); | 173 FPDFText_FindClose(search); |
| 174 | 174 |
| 175 // Two occurences of "world" in test page. | 175 // Two occurences of "world" in test page. |
| 176 search = FPDFText_FindStart(textpage, world.get(), 0, 2); | 176 search = FPDFText_FindStart(textpage, world.get(), 0, 2); |
| 177 EXPECT_NE(nullptr, search); | 177 EXPECT_TRUE(search); |
| 178 | 178 |
| 179 // Remains not found until advanced. | 179 // Remains not found until advanced. |
| 180 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 180 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 181 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 181 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| 182 | 182 |
| 183 // First occurence of "world" in this test page. | 183 // First occurence of "world" in this test page. |
| 184 EXPECT_TRUE(FPDFText_FindNext(search)); | 184 EXPECT_TRUE(FPDFText_FindNext(search)); |
| 185 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 185 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 186 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 186 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 187 | 187 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 202 | 202 |
| 203 // Found position unchanged when fails to retreat. | 203 // Found position unchanged when fails to retreat. |
| 204 EXPECT_FALSE(FPDFText_FindPrev(search)); | 204 EXPECT_FALSE(FPDFText_FindPrev(search)); |
| 205 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 205 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 206 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 206 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 207 FPDFText_FindClose(search); | 207 FPDFText_FindClose(search); |
| 208 | 208 |
| 209 // Exact search unaffected by case sensitiity and whole word flags. | 209 // Exact search unaffected by case sensitiity and whole word flags. |
| 210 search = FPDFText_FindStart(textpage, world.get(), | 210 search = FPDFText_FindStart(textpage, world.get(), |
| 211 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); | 211 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); |
| 212 EXPECT_NE(nullptr, search); | 212 EXPECT_TRUE(search); |
| 213 EXPECT_TRUE(FPDFText_FindNext(search)); | 213 EXPECT_TRUE(FPDFText_FindNext(search)); |
| 214 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 214 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 215 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 215 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 216 FPDFText_FindClose(search); | 216 FPDFText_FindClose(search); |
| 217 | 217 |
| 218 // Default is case-insensitive, so matching agaist caps works. | 218 // Default is case-insensitive, so matching agaist caps works. |
| 219 search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); | 219 search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); |
| 220 EXPECT_NE(nullptr, search); | 220 EXPECT_TRUE(search); |
| 221 EXPECT_TRUE(FPDFText_FindNext(search)); | 221 EXPECT_TRUE(FPDFText_FindNext(search)); |
| 222 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 222 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
| 223 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 223 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
| 224 FPDFText_FindClose(search); | 224 FPDFText_FindClose(search); |
| 225 | 225 |
| 226 // But can be made case sensitive, in which case this fails. | 226 // But can be made case sensitive, in which case this fails. |
| 227 search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); | 227 search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); |
| 228 EXPECT_FALSE(FPDFText_FindNext(search)); | 228 EXPECT_FALSE(FPDFText_FindNext(search)); |
| 229 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 229 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
| 230 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 230 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 245 FPDFText_FindClose(search); | 245 FPDFText_FindClose(search); |
| 246 | 246 |
| 247 FPDFText_ClosePage(textpage); | 247 FPDFText_ClosePage(textpage); |
| 248 UnloadPage(page); | 248 UnloadPage(page); |
| 249 } | 249 } |
| 250 | 250 |
| 251 // Test that the page has characters despite a bad stream length. | 251 // Test that the page has characters despite a bad stream length. |
| 252 TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { | 252 TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { |
| 253 EXPECT_TRUE(OpenDocument("bug_57.pdf")); | 253 EXPECT_TRUE(OpenDocument("bug_57.pdf")); |
| 254 FPDF_PAGE page = LoadPage(0); | 254 FPDF_PAGE page = LoadPage(0); |
| 255 EXPECT_NE(nullptr, page); | 255 EXPECT_TRUE(page); |
| 256 | 256 |
| 257 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 257 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 258 EXPECT_NE(nullptr, textpage); | 258 EXPECT_TRUE(textpage); |
| 259 EXPECT_EQ(13, FPDFText_CountChars(textpage)); | 259 EXPECT_EQ(13, FPDFText_CountChars(textpage)); |
| 260 | 260 |
| 261 FPDFText_ClosePage(textpage); | 261 FPDFText_ClosePage(textpage); |
| 262 UnloadPage(page); | 262 UnloadPage(page); |
| 263 } | 263 } |
| 264 | 264 |
| 265 TEST_F(FPDFTextEmbeddertest, WebLinks) { | 265 TEST_F(FPDFTextEmbeddertest, WebLinks) { |
| 266 EXPECT_TRUE(OpenDocument("weblinks.pdf")); | 266 EXPECT_TRUE(OpenDocument("weblinks.pdf")); |
| 267 FPDF_PAGE page = LoadPage(0); | 267 FPDF_PAGE page = LoadPage(0); |
| 268 EXPECT_NE(nullptr, page); | 268 EXPECT_TRUE(page); |
| 269 | 269 |
| 270 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 270 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 271 EXPECT_NE(nullptr, textpage); | 271 EXPECT_TRUE(textpage); |
| 272 | 272 |
| 273 FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); | 273 FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); |
| 274 EXPECT_NE(nullptr, pagelink); | 274 EXPECT_TRUE(pagelink); |
| 275 | 275 |
| 276 // Page contains two HTTP-style URLs. | 276 // Page contains two HTTP-style URLs. |
| 277 EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); | 277 EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); |
| 278 | 278 |
| 279 // Only a terminating NUL required for bogus links. | 279 // Only a terminating NUL required for bogus links. |
| 280 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); | 280 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); |
| 281 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); | 281 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); |
| 282 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); | 282 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); |
| 283 | 283 |
| 284 // Query the number of characters required for each link (incl NUL). | 284 // Query the number of characters required for each link (incl NUL). |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 EXPECT_EQ(-2.0, top); | 364 EXPECT_EQ(-2.0, top); |
| 365 | 365 |
| 366 FPDFLink_CloseWebLinks(pagelink); | 366 FPDFLink_CloseWebLinks(pagelink); |
| 367 FPDFText_ClosePage(textpage); | 367 FPDFText_ClosePage(textpage); |
| 368 UnloadPage(page); | 368 UnloadPage(page); |
| 369 } | 369 } |
| 370 | 370 |
| 371 TEST_F(FPDFTextEmbeddertest, GetFontSize) { | 371 TEST_F(FPDFTextEmbeddertest, GetFontSize) { |
| 372 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 372 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
| 373 FPDF_PAGE page = LoadPage(0); | 373 FPDF_PAGE page = LoadPage(0); |
| 374 EXPECT_NE(nullptr, page); | 374 EXPECT_TRUE(page); |
| 375 | 375 |
| 376 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 376 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
| 377 EXPECT_NE(nullptr, textpage); | 377 EXPECT_TRUE(textpage); |
| 378 | 378 |
| 379 const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | 379 const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, |
| 380 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, | 380 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, |
| 381 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; | 381 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; |
| 382 | 382 |
| 383 int count = FPDFText_CountChars(textpage); | 383 int count = FPDFText_CountChars(textpage); |
| 384 ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast<size_t>(count)); | 384 ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast<size_t>(count)); |
| 385 for (int i = 0; i < count; ++i) | 385 for (int i = 0; i < count; ++i) |
| 386 EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; | 386 EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; |
| 387 | 387 |
| 388 FPDFText_ClosePage(textpage); | 388 FPDFText_ClosePage(textpage); |
| 389 UnloadPage(page); | 389 UnloadPage(page); |
| 390 } | 390 } |
| OLD | NEW |