OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fpdfapi/parser/cpdf_array.h" | 5 #include "core/fpdfapi/parser/cpdf_array.h" |
6 #include "core/fpdfapi/parser/cpdf_boolean.h" | 6 #include "core/fpdfapi/parser/cpdf_boolean.h" |
7 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 7 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
8 #include "core/fpdfapi/parser/cpdf_name.h" | 8 #include "core/fpdfapi/parser/cpdf_name.h" |
9 #include "core/fpdfapi/parser/cpdf_null.h" | 9 #include "core/fpdfapi/parser/cpdf_null.h" |
10 #include "core/fpdfapi/parser/cpdf_number.h" | 10 #include "core/fpdfapi/parser/cpdf_number.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 // Number objects. | 52 // Number objects. |
53 CPDF_Number* number_int_obj = new CPDF_Number(1245); | 53 CPDF_Number* number_int_obj = new CPDF_Number(1245); |
54 CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); | 54 CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); |
55 // String objects. | 55 // String objects. |
56 CPDF_String* str_reg_obj = new CPDF_String(L"A simple test"); | 56 CPDF_String* str_reg_obj = new CPDF_String(L"A simple test"); |
57 CPDF_String* str_spec_obj = new CPDF_String(L"\t\n"); | 57 CPDF_String* str_spec_obj = new CPDF_String(L"\t\n"); |
58 // Name object. | 58 // Name object. |
59 CPDF_Name* name_obj = new CPDF_Name("space"); | 59 CPDF_Name* name_obj = new CPDF_Name("space"); |
60 // Array object. | 60 // Array object. |
61 m_ArrayObj = new CPDF_Array; | 61 m_ArrayObj = new CPDF_Array; |
62 m_ArrayObj->InsertAt(0, new CPDF_Number(8902)); | 62 m_ArrayObj->InsertNewAt<CPDF_Number>(0, 8902); |
63 m_ArrayObj->InsertAt(1, new CPDF_Name("address")); | 63 m_ArrayObj->InsertNewAt<CPDF_Name>(1, "address"); |
64 // Dictionary object. | 64 // Dictionary object. |
65 m_DictObj = new CPDF_Dictionary(); | 65 m_DictObj = new CPDF_Dictionary(); |
66 m_DictObj->SetFor("bool", new CPDF_Boolean(false)); | 66 m_DictObj->SetFor("bool", new CPDF_Boolean(false)); |
67 m_DictObj->SetFor("num", new CPDF_Number(0.23f)); | 67 m_DictObj->SetFor("num", new CPDF_Number(0.23f)); |
68 // Stream object. | 68 // Stream object. |
69 const char content[] = "abcdefghijklmnopqrstuvwxyz"; | 69 const char content[] = "abcdefghijklmnopqrstuvwxyz"; |
70 size_t buf_len = FX_ArraySize(content); | 70 size_t buf_len = FX_ArraySize(content); |
71 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); | 71 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); |
72 memcpy(buf, content, buf_len); | 72 memcpy(buf, content, buf_len); |
73 m_StreamDictObj = new CPDF_Dictionary(); | 73 m_StreamDictObj = new CPDF_Dictionary(); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 EXPECT_EQ(m_RefObjs[i].get(), m_RefObjs[i]->AsReference()); | 381 EXPECT_EQ(m_RefObjs[i].get(), m_RefObjs[i]->AsReference()); |
382 } | 382 } |
383 } | 383 } |
384 | 384 |
385 TEST(PDFArrayTest, GetMatrix) { | 385 TEST(PDFArrayTest, GetMatrix) { |
386 float elems[][6] = {{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, | 386 float elems[][6] = {{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, |
387 {1, 2, 3, 4, 5, 6}, | 387 {1, 2, 3, 4, 5, 6}, |
388 {2.3f, 4.05f, 3, -2, -3, 0.0f}, | 388 {2.3f, 4.05f, 3, -2, -3, 0.0f}, |
389 {0.05f, 0.1f, 0.56f, 0.67f, 1.34f, 99.9f}}; | 389 {0.05f, 0.1f, 0.56f, 0.67f, 1.34f, 99.9f}}; |
390 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { | 390 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { |
391 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 391 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
392 CFX_Matrix matrix(elems[i][0], elems[i][1], elems[i][2], elems[i][3], | 392 CFX_Matrix matrix(elems[i][0], elems[i][1], elems[i][2], elems[i][3], |
393 elems[i][4], elems[i][5]); | 393 elems[i][4], elems[i][5]); |
394 for (size_t j = 0; j < 6; ++j) | 394 for (size_t j = 0; j < 6; ++j) |
395 arr->AddNumber(elems[i][j]); | 395 arr->AddNew<CPDF_Number>(elems[i][j]); |
396 CFX_Matrix arr_matrix = arr->GetMatrix(); | 396 CFX_Matrix arr_matrix = arr->GetMatrix(); |
397 EXPECT_EQ(matrix.GetA(), arr_matrix.GetA()); | 397 EXPECT_EQ(matrix.GetA(), arr_matrix.GetA()); |
398 EXPECT_EQ(matrix.GetB(), arr_matrix.GetB()); | 398 EXPECT_EQ(matrix.GetB(), arr_matrix.GetB()); |
399 EXPECT_EQ(matrix.GetC(), arr_matrix.GetC()); | 399 EXPECT_EQ(matrix.GetC(), arr_matrix.GetC()); |
400 EXPECT_EQ(matrix.GetD(), arr_matrix.GetD()); | 400 EXPECT_EQ(matrix.GetD(), arr_matrix.GetD()); |
401 EXPECT_EQ(matrix.GetE(), arr_matrix.GetE()); | 401 EXPECT_EQ(matrix.GetE(), arr_matrix.GetE()); |
402 EXPECT_EQ(matrix.GetF(), arr_matrix.GetF()); | 402 EXPECT_EQ(matrix.GetF(), arr_matrix.GetF()); |
403 } | 403 } |
404 } | 404 } |
405 | 405 |
406 TEST(PDFArrayTest, GetRect) { | 406 TEST(PDFArrayTest, GetRect) { |
407 float elems[][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, | 407 float elems[][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, |
408 {1, 2, 5, 6}, | 408 {1, 2, 5, 6}, |
409 {2.3f, 4.05f, -3, 0.0f}, | 409 {2.3f, 4.05f, -3, 0.0f}, |
410 {0.05f, 0.1f, 1.34f, 99.9f}}; | 410 {0.05f, 0.1f, 1.34f, 99.9f}}; |
411 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { | 411 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { |
412 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 412 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
413 CFX_FloatRect rect(elems[i]); | 413 CFX_FloatRect rect(elems[i]); |
414 for (size_t j = 0; j < 4; ++j) | 414 for (size_t j = 0; j < 4; ++j) |
415 arr->AddNumber(elems[i][j]); | 415 arr->AddNew<CPDF_Number>(elems[i][j]); |
416 CFX_FloatRect arr_rect = arr->GetRect(); | 416 CFX_FloatRect arr_rect = arr->GetRect(); |
417 EXPECT_EQ(rect.left, arr_rect.left); | 417 EXPECT_EQ(rect.left, arr_rect.left); |
418 EXPECT_EQ(rect.right, arr_rect.right); | 418 EXPECT_EQ(rect.right, arr_rect.right); |
419 EXPECT_EQ(rect.bottom, arr_rect.bottom); | 419 EXPECT_EQ(rect.bottom, arr_rect.bottom); |
420 EXPECT_EQ(rect.top, arr_rect.top); | 420 EXPECT_EQ(rect.top, arr_rect.top); |
421 } | 421 } |
422 } | 422 } |
423 | 423 |
424 TEST(PDFArrayTest, GetTypeAt) { | 424 TEST(PDFArrayTest, GetTypeAt) { |
425 { | 425 { |
426 // Boolean array. | 426 // Boolean array. |
427 const bool vals[] = {true, false, false, true, true}; | 427 const bool vals[] = {true, false, false, true, true}; |
428 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 428 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
429 for (size_t i = 0; i < FX_ArraySize(vals); ++i) | 429 for (size_t i = 0; i < FX_ArraySize(vals); ++i) |
430 arr->InsertAt(i, new CPDF_Boolean(vals[i])); | 430 arr->InsertNewAt<CPDF_Boolean>(i, vals[i]); |
431 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 431 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
432 TestArrayAccessors(arr.get(), i, // Array and index. | 432 TestArrayAccessors(arr.get(), i, // Array and index. |
433 vals[i] ? "true" : "false", // String value. | 433 vals[i] ? "true" : "false", // String value. |
434 nullptr, // Const string value. | 434 nullptr, // Const string value. |
435 vals[i] ? 1 : 0, // Integer value. | 435 vals[i] ? 1 : 0, // Integer value. |
436 0, // Float value. | 436 0, // Float value. |
437 nullptr, // Array value. | 437 nullptr, // Array value. |
438 nullptr, // Dictionary value. | 438 nullptr, // Dictionary value. |
439 nullptr); // Stream value. | 439 nullptr); // Stream value. |
440 } | 440 } |
441 } | 441 } |
442 { | 442 { |
443 // Integer array. | 443 // Integer array. |
444 const int vals[] = {10, 0, -345, 2089345456, -1000000000, 567, 93658767}; | 444 const int vals[] = {10, 0, -345, 2089345456, -1000000000, 567, 93658767}; |
445 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 445 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
446 for (size_t i = 0; i < FX_ArraySize(vals); ++i) | 446 for (size_t i = 0; i < FX_ArraySize(vals); ++i) |
447 arr->InsertAt(i, new CPDF_Number(vals[i])); | 447 arr->InsertNewAt<CPDF_Number>(i, vals[i]); |
448 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 448 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
449 char buf[33]; | 449 char buf[33]; |
450 TestArrayAccessors(arr.get(), i, // Array and index. | 450 TestArrayAccessors(arr.get(), i, // Array and index. |
451 FXSYS_itoa(vals[i], buf, 10), // String value. | 451 FXSYS_itoa(vals[i], buf, 10), // String value. |
452 nullptr, // Const string value. | 452 nullptr, // Const string value. |
453 vals[i], // Integer value. | 453 vals[i], // Integer value. |
454 vals[i], // Float value. | 454 vals[i], // Float value. |
455 nullptr, // Array value. | 455 nullptr, // Array value. |
456 nullptr, // Dictionary value. | 456 nullptr, // Dictionary value. |
457 nullptr); // Stream value. | 457 nullptr); // Stream value. |
458 } | 458 } |
459 } | 459 } |
460 { | 460 { |
461 // Float array. | 461 // Float array. |
462 const float vals[] = {0.0f, 0, 10, 10.0f, 0.0345f, | 462 const float vals[] = {0.0f, 0, 10, 10.0f, 0.0345f, |
463 897.34f, -2.5f, -1.0f, -345.0f, -0.0f}; | 463 897.34f, -2.5f, -1.0f, -345.0f, -0.0f}; |
464 const char* const expected_str[] = { | 464 const char* const expected_str[] = { |
465 "0", "0", "10", "10", "0.0345", "897.34", "-2.5", "-1", "-345", "0"}; | 465 "0", "0", "10", "10", "0.0345", "897.34", "-2.5", "-1", "-345", "0"}; |
466 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 466 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
467 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 467 for (size_t i = 0; i < FX_ArraySize(vals); ++i) |
468 arr->InsertAt(i, new CPDF_Number(vals[i])); | 468 arr->InsertNewAt<CPDF_Number>(i, vals[i]); |
469 } | |
470 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 469 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
471 TestArrayAccessors(arr.get(), i, // Array and index. | 470 TestArrayAccessors(arr.get(), i, // Array and index. |
472 expected_str[i], // String value. | 471 expected_str[i], // String value. |
473 nullptr, // Const string value. | 472 nullptr, // Const string value. |
474 vals[i], // Integer value. | 473 vals[i], // Integer value. |
475 vals[i], // Float value. | 474 vals[i], // Float value. |
476 nullptr, // Array value. | 475 nullptr, // Array value. |
477 nullptr, // Dictionary value. | 476 nullptr, // Dictionary value. |
478 nullptr); // Stream value. | 477 nullptr); // Stream value. |
479 } | 478 } |
480 } | 479 } |
481 { | 480 { |
482 // String and name array | 481 // String and name array |
483 const char* const vals[] = {"this", "adsde$%^", "\r\t", "\"012", | 482 const char* const vals[] = {"this", "adsde$%^", "\r\t", "\"012", |
484 ".", "EYREW", "It is a joke :)"}; | 483 ".", "EYREW", "It is a joke :)"}; |
485 std::unique_ptr<CPDF_Array> string_array(new CPDF_Array); | 484 std::unique_ptr<CPDF_Array> string_array(new CPDF_Array); |
486 std::unique_ptr<CPDF_Array> name_array(new CPDF_Array); | 485 std::unique_ptr<CPDF_Array> name_array(new CPDF_Array); |
487 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 486 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
488 string_array->InsertAt(i, new CPDF_String(vals[i], false)); | 487 string_array->InsertNewAt<CPDF_String>(i, vals[i], false); |
489 name_array->InsertAt(i, new CPDF_Name(vals[i])); | 488 name_array->InsertNewAt<CPDF_Name>(i, vals[i]); |
490 } | 489 } |
491 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 490 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
492 TestArrayAccessors(string_array.get(), i, // Array and index. | 491 TestArrayAccessors(string_array.get(), i, // Array and index. |
493 vals[i], // String value. | 492 vals[i], // String value. |
494 vals[i], // Const string value. | 493 vals[i], // Const string value. |
495 0, // Integer value. | 494 0, // Integer value. |
496 0, // Float value. | 495 0, // Float value. |
497 nullptr, // Array value. | 496 nullptr, // Array value. |
498 nullptr, // Dictionary value. | 497 nullptr, // Dictionary value. |
499 nullptr); // Stream value. | 498 nullptr); // Stream value. |
500 TestArrayAccessors(name_array.get(), i, // Array and index. | 499 TestArrayAccessors(name_array.get(), i, // Array and index. |
501 vals[i], // String value. | 500 vals[i], // String value. |
502 vals[i], // Const string value. | 501 vals[i], // Const string value. |
503 0, // Integer value. | 502 0, // Integer value. |
504 0, // Float value. | 503 0, // Float value. |
505 nullptr, // Array value. | 504 nullptr, // Array value. |
506 nullptr, // Dictionary value. | 505 nullptr, // Dictionary value. |
507 nullptr); // Stream value. | 506 nullptr); // Stream value. |
508 } | 507 } |
509 } | 508 } |
510 { | 509 { |
511 // Null element array. | 510 // Null element array. |
512 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 511 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
513 for (size_t i = 0; i < 3; ++i) | 512 for (size_t i = 0; i < 3; ++i) |
514 arr->InsertAt(i, new CPDF_Null); | 513 arr->InsertNewAt<CPDF_Null>(i); |
515 for (size_t i = 0; i < 3; ++i) { | 514 for (size_t i = 0; i < 3; ++i) { |
516 TestArrayAccessors(arr.get(), i, // Array and index. | 515 TestArrayAccessors(arr.get(), i, // Array and index. |
517 "", // String value. | 516 "", // String value. |
518 nullptr, // Const string value. | 517 nullptr, // Const string value. |
519 0, // Integer value. | 518 0, // Integer value. |
520 0, // Float value. | 519 0, // Float value. |
521 nullptr, // Array value. | 520 nullptr, // Array value. |
522 nullptr, // Dictionary value. | 521 nullptr, // Dictionary value. |
523 nullptr); // Stream value. | 522 nullptr); // Stream value. |
524 } | 523 } |
525 } | 524 } |
526 { | 525 { |
527 // Array of array. | 526 // Array of array. |
528 CPDF_Array* vals[3]; | 527 CPDF_Array* vals[3]; |
529 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 528 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
530 for (size_t i = 0; i < 3; ++i) { | 529 for (size_t i = 0; i < 3; ++i) { |
531 vals[i] = new CPDF_Array; | 530 vals[i] = arr->AddNew<CPDF_Array>(); |
532 for (size_t j = 0; j < 3; ++j) { | 531 for (size_t j = 0; j < 3; ++j) { |
533 int value = j + 100; | 532 int value = j + 100; |
534 vals[i]->InsertAt(i, new CPDF_Number(value)); | 533 vals[i]->InsertNewAt<CPDF_Number>(i, value); |
535 } | 534 } |
536 arr->InsertAt(i, vals[i]); | |
537 } | 535 } |
538 for (size_t i = 0; i < 3; ++i) { | 536 for (size_t i = 0; i < 3; ++i) { |
539 TestArrayAccessors(arr.get(), i, // Array and index. | 537 TestArrayAccessors(arr.get(), i, // Array and index. |
540 "", // String value. | 538 "", // String value. |
541 nullptr, // Const string value. | 539 nullptr, // Const string value. |
542 0, // Integer value. | 540 0, // Integer value. |
543 0, // Float value. | 541 0, // Float value. |
544 vals[i], // Array value. | 542 vals[i], // Array value. |
545 nullptr, // Dictionary value. | 543 nullptr, // Dictionary value. |
546 nullptr); // Stream value. | 544 nullptr); // Stream value. |
547 } | 545 } |
548 } | 546 } |
549 { | 547 { |
550 // Dictionary array. | 548 // Dictionary array. |
551 CPDF_Dictionary* vals[3]; | 549 CPDF_Dictionary* vals[3]; |
552 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 550 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
553 for (size_t i = 0; i < 3; ++i) { | 551 for (size_t i = 0; i < 3; ++i) { |
554 vals[i] = new CPDF_Dictionary(); | 552 vals[i] = arr->AddNew<CPDF_Dictionary>(); |
555 for (size_t j = 0; j < 3; ++j) { | 553 for (size_t j = 0; j < 3; ++j) { |
556 std::string key("key"); | 554 std::string key("key"); |
557 char buf[33]; | 555 char buf[33]; |
558 key.append(FXSYS_itoa(j, buf, 10)); | 556 key.append(FXSYS_itoa(j, buf, 10)); |
559 int value = j + 200; | 557 int value = j + 200; |
560 vals[i]->SetFor(key.c_str(), new CPDF_Number(value)); | 558 vals[i]->SetFor(key.c_str(), new CPDF_Number(value)); |
561 } | 559 } |
562 arr->InsertAt(i, vals[i]); | |
563 } | 560 } |
564 for (size_t i = 0; i < 3; ++i) { | 561 for (size_t i = 0; i < 3; ++i) { |
565 TestArrayAccessors(arr.get(), i, // Array and index. | 562 TestArrayAccessors(arr.get(), i, // Array and index. |
566 "", // String value. | 563 "", // String value. |
567 nullptr, // Const string value. | 564 nullptr, // Const string value. |
568 0, // Integer value. | 565 0, // Integer value. |
569 0, // Float value. | 566 0, // Float value. |
570 nullptr, // Array value. | 567 nullptr, // Array value. |
571 vals[i], // Dictionary value. | 568 vals[i], // Dictionary value. |
572 nullptr); // Stream value. | 569 nullptr); // Stream value. |
573 } | 570 } |
574 } | 571 } |
575 { | 572 { |
576 // Stream array. | 573 // Stream array. |
577 CPDF_Dictionary* vals[3]; | 574 CPDF_Dictionary* vals[3]; |
578 CPDF_Stream* stream_vals[3]; | 575 CPDF_Stream* stream_vals[3]; |
579 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 576 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
580 for (size_t i = 0; i < 3; ++i) { | 577 for (size_t i = 0; i < 3; ++i) { |
581 vals[i] = new CPDF_Dictionary(); | 578 vals[i] = new CPDF_Dictionary(); |
582 for (size_t j = 0; j < 3; ++j) { | 579 for (size_t j = 0; j < 3; ++j) { |
583 std::string key("key"); | 580 std::string key("key"); |
584 char buf[33]; | 581 char buf[33]; |
585 key.append(FXSYS_itoa(j, buf, 10)); | 582 key.append(FXSYS_itoa(j, buf, 10)); |
586 int value = j + 200; | 583 int value = j + 200; |
587 vals[i]->SetFor(key.c_str(), new CPDF_Number(value)); | 584 vals[i]->SetFor(key.c_str(), new CPDF_Number(value)); |
588 } | 585 } |
589 uint8_t content[] = "content: this is a stream"; | 586 uint8_t content[] = "content: this is a stream"; |
590 size_t data_size = FX_ArraySize(content); | 587 size_t data_size = FX_ArraySize(content); |
591 uint8_t* data = reinterpret_cast<uint8_t*>(malloc(data_size)); | 588 uint8_t* data = reinterpret_cast<uint8_t*>(malloc(data_size)); |
592 memcpy(data, content, data_size); | 589 memcpy(data, content, data_size); |
593 stream_vals[i] = new CPDF_Stream(data, data_size, vals[i]); | 590 stream_vals[i] = arr->AddNew<CPDF_Stream>(data, data_size, vals[i]); |
594 arr->InsertAt(i, stream_vals[i]); | |
595 } | 591 } |
596 for (size_t i = 0; i < 3; ++i) { | 592 for (size_t i = 0; i < 3; ++i) { |
597 TestArrayAccessors(arr.get(), i, // Array and index. | 593 TestArrayAccessors(arr.get(), i, // Array and index. |
598 "", // String value. | 594 "", // String value. |
599 nullptr, // Const string value. | 595 nullptr, // Const string value. |
600 0, // Integer value. | 596 0, // Integer value. |
601 0, // Float value. | 597 0, // Float value. |
602 nullptr, // Array value. | 598 nullptr, // Array value. |
603 vals[i], // Dictionary value. | 599 vals[i], // Dictionary value. |
604 stream_vals[i]); // Stream value. | 600 stream_vals[i]); // Stream value. |
605 } | 601 } |
606 } | 602 } |
607 { | 603 { |
608 // Mixed array. | 604 // Mixed array. |
609 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 605 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
610 // Array arr will take ownership of all the objects inserted. | 606 arr->InsertNewAt<CPDF_Boolean>(0, true); |
611 arr->InsertAt(0, new CPDF_Boolean(true)); | 607 arr->InsertNewAt<CPDF_Boolean>(1, false); |
612 arr->InsertAt(1, new CPDF_Boolean(false)); | 608 arr->InsertNewAt<CPDF_Number>(2, 0); |
613 arr->InsertAt(2, new CPDF_Number(0)); | 609 arr->InsertNewAt<CPDF_Number>(3, -1234); |
614 arr->InsertAt(3, new CPDF_Number(-1234)); | 610 arr->InsertNewAt<CPDF_Number>(4, 2345.0f); |
615 arr->InsertAt(4, new CPDF_Number(2345.0f)); | 611 arr->InsertNewAt<CPDF_Number>(5, 0.05f); |
616 arr->InsertAt(5, new CPDF_Number(0.05f)); | 612 arr->InsertNewAt<CPDF_String>(6, "", false); |
617 arr->InsertAt(6, new CPDF_String("", false)); | 613 arr->InsertNewAt<CPDF_String>(7, "It is a test!", false); |
618 arr->InsertAt(7, new CPDF_String("It is a test!", false)); | 614 arr->InsertNewAt<CPDF_Name>(8, "NAME"); |
619 arr->InsertAt(8, new CPDF_Name("NAME")); | 615 arr->InsertNewAt<CPDF_Name>(9, "test"); |
620 arr->InsertAt(9, new CPDF_Name("test")); | 616 arr->InsertNewAt<CPDF_Null>(10); |
621 arr->InsertAt(10, new CPDF_Null()); | 617 |
622 CPDF_Array* arr_val = new CPDF_Array; | 618 CPDF_Array* arr_val = arr->InsertNewAt<CPDF_Array>(11); |
623 arr_val->AddNumber(1); | 619 arr_val->AddNew<CPDF_Number>(1); |
624 arr_val->AddNumber(2); | 620 arr_val->AddNew<CPDF_Number>(2); |
625 arr->InsertAt(11, arr_val); | 621 |
626 CPDF_Dictionary* dict_val = new CPDF_Dictionary(); | 622 CPDF_Dictionary* dict_val = arr->InsertNewAt<CPDF_Dictionary>(12); |
627 dict_val->SetFor("key1", new CPDF_String("Linda", false)); | 623 dict_val->SetFor("key1", new CPDF_String("Linda", false)); |
628 dict_val->SetFor("key2", new CPDF_String("Zoe", false)); | 624 dict_val->SetFor("key2", new CPDF_String("Zoe", false)); |
629 arr->InsertAt(12, dict_val); | 625 |
630 CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); | 626 CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); |
631 stream_dict->SetFor("key1", new CPDF_String("John", false)); | 627 stream_dict->SetFor("key1", new CPDF_String("John", false)); |
632 stream_dict->SetFor("key2", new CPDF_String("King", false)); | 628 stream_dict->SetFor("key2", new CPDF_String("King", false)); |
633 uint8_t data[] = "A stream for test"; | 629 uint8_t data[] = "A stream for test"; |
634 // The data buffer will be owned by stream object, so it needs to be | 630 // The data buffer will be owned by stream object, so it needs to be |
635 // dynamically allocated. | 631 // dynamically allocated. |
636 size_t buf_size = sizeof(data); | 632 size_t buf_size = sizeof(data); |
637 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_size)); | 633 uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_size)); |
638 memcpy(buf, data, buf_size); | 634 memcpy(buf, data, buf_size); |
639 CPDF_Stream* stream_val = new CPDF_Stream(buf, buf_size, stream_dict); | 635 CPDF_Stream* stream_val = |
640 arr->InsertAt(13, stream_val); | 636 arr->InsertNewAt<CPDF_Stream>(13, buf, buf_size, stream_dict); |
641 const char* const expected_str[] = { | 637 const char* const expected_str[] = { |
642 "true", "false", "0", "-1234", "2345", "0.05", "", | 638 "true", "false", "0", "-1234", "2345", "0.05", "", |
643 "It is a test!", "NAME", "test", "", "", "", ""}; | 639 "It is a test!", "NAME", "test", "", "", "", ""}; |
644 const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, | 640 const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, |
645 0, 0, 0, 0, 0, 0, 0}; | 641 0, 0, 0, 0, 0, 0, 0}; |
646 const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, | 642 const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, |
647 0, 0, 0, 0, 0, 0, 0}; | 643 0, 0, 0, 0, 0, 0, 0}; |
648 for (size_t i = 0; i < arr->GetCount(); ++i) { | 644 for (size_t i = 0; i < arr->GetCount(); ++i) { |
649 EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); | 645 EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); |
650 EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); | 646 EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); |
(...skipping 13 matching lines...) Expand all Loading... |
664 else | 660 else |
665 EXPECT_EQ(nullptr, arr->GetDictAt(i)); | 661 EXPECT_EQ(nullptr, arr->GetDictAt(i)); |
666 } | 662 } |
667 } | 663 } |
668 } | 664 } |
669 } | 665 } |
670 | 666 |
671 TEST(PDFArrayTest, AddNumber) { | 667 TEST(PDFArrayTest, AddNumber) { |
672 float vals[] = {1.0f, -1.0f, 0, 0.456734f, | 668 float vals[] = {1.0f, -1.0f, 0, 0.456734f, |
673 12345.54321f, 0.5f, 1000, 0.000045f}; | 669 12345.54321f, 0.5f, 1000, 0.000045f}; |
674 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 670 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
675 for (size_t i = 0; i < FX_ArraySize(vals); ++i) | 671 for (size_t i = 0; i < FX_ArraySize(vals); ++i) |
676 arr->AddNumber(vals[i]); | 672 arr->AddNew<CPDF_Number>(vals[i]); |
677 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 673 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
678 EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); | 674 EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); |
679 EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); | 675 EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); |
680 } | 676 } |
681 } | 677 } |
682 | 678 |
683 TEST(PDFArrayTest, AddInteger) { | 679 TEST(PDFArrayTest, AddInteger) { |
684 int vals[] = {0, 1, 934435456, 876, 10000, -1, -24354656, -100}; | 680 int vals[] = {0, 1, 934435456, 876, 10000, -1, -24354656, -100}; |
685 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 681 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
686 for (size_t i = 0; i < FX_ArraySize(vals); ++i) | 682 for (size_t i = 0; i < FX_ArraySize(vals); ++i) |
687 arr->AddInteger(vals[i]); | 683 arr->AddNew<CPDF_Number>(vals[i]); |
688 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 684 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
689 EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); | 685 EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); |
690 EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); | 686 EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); |
691 } | 687 } |
692 } | 688 } |
693 | 689 |
694 TEST(PDFArrayTest, AddStringAndName) { | 690 TEST(PDFArrayTest, AddStringAndName) { |
695 const char* vals[] = {"", "a", "ehjhRIOYTTFdfcdnv", "122323", | 691 const char* vals[] = {"", "a", "ehjhRIOYTTFdfcdnv", "122323", |
696 "$#%^&**", " ", "This is a test.\r\n"}; | 692 "$#%^&**", " ", "This is a test.\r\n"}; |
697 std::unique_ptr<CPDF_Array> string_array(new CPDF_Array); | 693 std::unique_ptr<CPDF_Array> string_array(new CPDF_Array); |
698 std::unique_ptr<CPDF_Array> name_array(new CPDF_Array); | 694 std::unique_ptr<CPDF_Array> name_array(new CPDF_Array); |
699 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 695 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
700 string_array->AddString(vals[i]); | 696 string_array->AddNew<CPDF_String>(vals[i], false); |
701 name_array->AddName(vals[i]); | 697 name_array->AddNew<CPDF_Name>(vals[i]); |
702 } | 698 } |
703 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { | 699 for (size_t i = 0; i < FX_ArraySize(vals); ++i) { |
704 EXPECT_EQ(CPDF_Object::STRING, string_array->GetObjectAt(i)->GetType()); | 700 EXPECT_EQ(CPDF_Object::STRING, string_array->GetObjectAt(i)->GetType()); |
705 EXPECT_STREQ(vals[i], string_array->GetObjectAt(i)->GetString().c_str()); | 701 EXPECT_STREQ(vals[i], string_array->GetObjectAt(i)->GetString().c_str()); |
706 EXPECT_EQ(CPDF_Object::NAME, name_array->GetObjectAt(i)->GetType()); | 702 EXPECT_EQ(CPDF_Object::NAME, name_array->GetObjectAt(i)->GetType()); |
707 EXPECT_STREQ(vals[i], name_array->GetObjectAt(i)->GetString().c_str()); | 703 EXPECT_STREQ(vals[i], name_array->GetObjectAt(i)->GetString().c_str()); |
708 } | 704 } |
709 } | 705 } |
710 | 706 |
711 TEST(PDFArrayTest, AddReferenceAndGetObjectAt) { | 707 TEST(PDFArrayTest, AddReferenceAndGetObjectAt) { |
712 std::unique_ptr<CPDF_IndirectObjectHolder> holder( | 708 std::unique_ptr<CPDF_IndirectObjectHolder> holder( |
713 new CPDF_IndirectObjectHolder()); | 709 new CPDF_IndirectObjectHolder()); |
714 CPDF_Boolean* boolean_obj = new CPDF_Boolean(true); | 710 CPDF_Boolean* boolean_obj = new CPDF_Boolean(true); |
715 CPDF_Number* int_obj = new CPDF_Number(-1234); | 711 CPDF_Number* int_obj = new CPDF_Number(-1234); |
716 CPDF_Number* float_obj = new CPDF_Number(2345.089f); | 712 CPDF_Number* float_obj = new CPDF_Number(2345.089f); |
717 CPDF_String* str_obj = new CPDF_String("Adsfdsf 343434 %&&*\n", false); | 713 CPDF_String* str_obj = new CPDF_String("Adsfdsf 343434 %&&*\n", false); |
718 CPDF_Name* name_obj = new CPDF_Name("Title:"); | 714 CPDF_Name* name_obj = new CPDF_Name("Title:"); |
719 CPDF_Null* null_obj = new CPDF_Null(); | 715 CPDF_Null* null_obj = new CPDF_Null(); |
720 CPDF_Object* indirect_objs[] = {boolean_obj, int_obj, float_obj, | 716 CPDF_Object* indirect_objs[] = {boolean_obj, int_obj, float_obj, |
721 str_obj, name_obj, null_obj}; | 717 str_obj, name_obj, null_obj}; |
722 unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; | 718 unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; |
723 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 719 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
724 std::unique_ptr<CPDF_Array> arr1(new CPDF_Array); | 720 std::unique_ptr<CPDF_Array> arr1(new CPDF_Array); |
725 // Create two arrays of references by different AddReference() APIs. | 721 // Create two arrays of references by different AddReference() APIs. |
726 for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { | 722 for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { |
727 holder->ReplaceIndirectObjectIfHigherGeneration( | 723 holder->ReplaceIndirectObjectIfHigherGeneration( |
728 obj_nums[i], pdfium::WrapUnique<CPDF_Object>(indirect_objs[i])); | 724 obj_nums[i], pdfium::WrapUnique<CPDF_Object>(indirect_objs[i])); |
729 arr->AddReference(holder.get(), obj_nums[i]); | 725 arr->AddNew<CPDF_Reference>(holder.get(), obj_nums[i]); |
730 arr1->AddReference(holder.get(), indirect_objs[i]->GetObjNum()); | 726 arr1->AddNew<CPDF_Reference>(holder.get(), indirect_objs[i]->GetObjNum()); |
731 } | 727 } |
732 // Check indirect objects. | 728 // Check indirect objects. |
733 for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) | 729 for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) |
734 EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); | 730 EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); |
735 // Check arrays. | 731 // Check arrays. |
736 EXPECT_EQ(arr->GetCount(), arr1->GetCount()); | 732 EXPECT_EQ(arr->GetCount(), arr1->GetCount()); |
737 for (size_t i = 0; i < arr->GetCount(); ++i) { | 733 for (size_t i = 0; i < arr->GetCount(); ++i) { |
738 EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); | 734 EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); |
739 EXPECT_EQ(indirect_objs[i], arr->GetObjectAt(i)->GetDirect()); | 735 EXPECT_EQ(indirect_objs[i], arr->GetObjectAt(i)->GetDirect()); |
740 EXPECT_EQ(indirect_objs[i], arr->GetDirectObjectAt(i)); | 736 EXPECT_EQ(indirect_objs[i], arr->GetDirectObjectAt(i)); |
741 EXPECT_EQ(CPDF_Object::REFERENCE, arr1->GetObjectAt(i)->GetType()); | 737 EXPECT_EQ(CPDF_Object::REFERENCE, arr1->GetObjectAt(i)->GetType()); |
742 EXPECT_EQ(indirect_objs[i], arr1->GetObjectAt(i)->GetDirect()); | 738 EXPECT_EQ(indirect_objs[i], arr1->GetObjectAt(i)->GetDirect()); |
743 EXPECT_EQ(indirect_objs[i], arr1->GetDirectObjectAt(i)); | 739 EXPECT_EQ(indirect_objs[i], arr1->GetDirectObjectAt(i)); |
744 } | 740 } |
745 } | 741 } |
746 | 742 |
747 TEST(PDFArrayTest, CloneDirectObject) { | 743 TEST(PDFArrayTest, CloneDirectObject) { |
748 CPDF_IndirectObjectHolder objects_holder; | 744 CPDF_IndirectObjectHolder objects_holder; |
749 std::unique_ptr<CPDF_Array> array(new CPDF_Array); | 745 std::unique_ptr<CPDF_Array> array(new CPDF_Array); |
750 array->AddReference(&objects_holder, 1234); | 746 array->AddNew<CPDF_Reference>(&objects_holder, 1234); |
751 ASSERT_EQ(1U, array->GetCount()); | 747 ASSERT_EQ(1U, array->GetCount()); |
752 CPDF_Object* obj = array->GetObjectAt(0); | 748 CPDF_Object* obj = array->GetObjectAt(0); |
753 ASSERT_TRUE(obj); | 749 ASSERT_TRUE(obj); |
754 EXPECT_TRUE(obj->IsReference()); | 750 EXPECT_TRUE(obj->IsReference()); |
755 | 751 |
756 std::unique_ptr<CPDF_Object> cloned_array_object = array->CloneDirectObject(); | 752 std::unique_ptr<CPDF_Object> cloned_array_object = array->CloneDirectObject(); |
757 ASSERT_TRUE(cloned_array_object); | 753 ASSERT_TRUE(cloned_array_object); |
758 ASSERT_TRUE(cloned_array_object->IsArray()); | 754 ASSERT_TRUE(cloned_array_object->IsArray()); |
759 | 755 |
760 std::unique_ptr<CPDF_Array> cloned_array = | 756 std::unique_ptr<CPDF_Array> cloned_array = |
761 ToArray(std::move(cloned_array_object)); | 757 ToArray(std::move(cloned_array_object)); |
762 ASSERT_EQ(1U, cloned_array->GetCount()); | 758 ASSERT_EQ(1U, cloned_array->GetCount()); |
763 CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0); | 759 CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0); |
764 EXPECT_FALSE(cloned_obj); | 760 EXPECT_FALSE(cloned_obj); |
765 } | 761 } |
766 | 762 |
767 TEST(PDFArrayTest, ConvertIndirect) { | 763 TEST(PDFArrayTest, ConvertIndirect) { |
768 CPDF_IndirectObjectHolder objects_holder; | 764 CPDF_IndirectObjectHolder objects_holder; |
769 std::unique_ptr<CPDF_Array> array(new CPDF_Array); | 765 auto array = pdfium::MakeUnique<CPDF_Array>(); |
770 CPDF_Object* pObj = new CPDF_Number(42); | 766 CPDF_Object* pObj = array->AddNew<CPDF_Number>(42); |
771 array->Add(pObj); | |
772 array->ConvertToIndirectObjectAt(0, &objects_holder); | 767 array->ConvertToIndirectObjectAt(0, &objects_holder); |
773 CPDF_Object* pRef = array->GetObjectAt(0); | 768 CPDF_Object* pRef = array->GetObjectAt(0); |
774 CPDF_Object* pNum = array->GetDirectObjectAt(0); | 769 CPDF_Object* pNum = array->GetDirectObjectAt(0); |
775 EXPECT_TRUE(pRef->IsReference()); | 770 EXPECT_TRUE(pRef->IsReference()); |
776 EXPECT_TRUE(pNum->IsNumber()); | 771 EXPECT_TRUE(pNum->IsNumber()); |
777 EXPECT_NE(pObj, pRef); | 772 EXPECT_NE(pObj, pRef); |
778 EXPECT_EQ(pObj, pNum); | 773 EXPECT_EQ(pObj, pNum); |
779 EXPECT_EQ(42, array->GetIntegerAt(0)); | 774 EXPECT_EQ(42, array->GetIntegerAt(0)); |
780 } | 775 } |
781 | 776 |
(...skipping 13 matching lines...) Expand all Loading... |
795 std::unique_ptr<CPDF_Dictionary> cloned_dict = | 790 std::unique_ptr<CPDF_Dictionary> cloned_dict = |
796 ToDictionary(std::move(cloned_dict_object)); | 791 ToDictionary(std::move(cloned_dict_object)); |
797 ASSERT_EQ(1U, cloned_dict->GetCount()); | 792 ASSERT_EQ(1U, cloned_dict->GetCount()); |
798 CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo"); | 793 CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo"); |
799 EXPECT_FALSE(cloned_obj); | 794 EXPECT_FALSE(cloned_obj); |
800 } | 795 } |
801 | 796 |
802 TEST(PDFObjectTest, CloneCheckLoop) { | 797 TEST(PDFObjectTest, CloneCheckLoop) { |
803 { | 798 { |
804 // Create a dictionary/array pair with a reference loop. | 799 // Create a dictionary/array pair with a reference loop. |
805 CPDF_Dictionary* dict_obj = new CPDF_Dictionary(); | 800 auto arr_obj = pdfium::MakeUnique<CPDF_Array>(); |
806 std::unique_ptr<CPDF_Array> arr_obj(new CPDF_Array); | 801 CPDF_Dictionary* dict_obj = arr_obj->InsertNewAt<CPDF_Dictionary>(0); |
807 dict_obj->SetFor("arr", arr_obj.get()); | 802 dict_obj->SetFor("arr", arr_obj.get()); |
808 arr_obj->InsertAt(0, dict_obj); | |
809 | |
810 // Clone this object to see whether stack overflow will be triggered. | 803 // Clone this object to see whether stack overflow will be triggered. |
811 std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone()); | 804 std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone()); |
812 // Cloned object should be the same as the original. | 805 // Cloned object should be the same as the original. |
813 ASSERT_TRUE(cloned_array); | 806 ASSERT_TRUE(cloned_array); |
814 EXPECT_EQ(1u, cloned_array->GetCount()); | 807 EXPECT_EQ(1u, cloned_array->GetCount()); |
815 CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); | 808 CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); |
816 ASSERT_TRUE(cloned_dict); | 809 ASSERT_TRUE(cloned_dict); |
817 ASSERT_TRUE(cloned_dict->IsDictionary()); | 810 ASSERT_TRUE(cloned_dict->IsDictionary()); |
818 // Recursively referenced object is not cloned. | 811 // Recursively referenced object is not cloned. |
819 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); | 812 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); |
(...skipping 13 matching lines...) Expand all Loading... |
833 ASSERT_TRUE(cloned_dict); | 826 ASSERT_TRUE(cloned_dict); |
834 ASSERT_TRUE(cloned_dict->IsDictionary()); | 827 ASSERT_TRUE(cloned_dict->IsDictionary()); |
835 // Recursively referenced object is not cloned. | 828 // Recursively referenced object is not cloned. |
836 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); | 829 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); |
837 } | 830 } |
838 { | 831 { |
839 CPDF_IndirectObjectHolder objects_holder; | 832 CPDF_IndirectObjectHolder objects_holder; |
840 // Create an object with a reference loop. | 833 // Create an object with a reference loop. |
841 CPDF_Dictionary* dict_obj = objects_holder.NewIndirect<CPDF_Dictionary>(); | 834 CPDF_Dictionary* dict_obj = objects_holder.NewIndirect<CPDF_Dictionary>(); |
842 std::unique_ptr<CPDF_Array> arr_obj = pdfium::MakeUnique<CPDF_Array>(); | 835 std::unique_ptr<CPDF_Array> arr_obj = pdfium::MakeUnique<CPDF_Array>(); |
843 arr_obj->InsertAt( | 836 arr_obj->InsertNewAt<CPDF_Reference>(0, &objects_holder, |
844 0, new CPDF_Reference(&objects_holder, dict_obj->GetObjNum())); | 837 dict_obj->GetObjNum()); |
845 CPDF_Object* elem0 = arr_obj->GetObjectAt(0); | 838 CPDF_Object* elem0 = arr_obj->GetObjectAt(0); |
846 dict_obj->SetFor("arr", arr_obj.release()); | 839 dict_obj->SetFor("arr", arr_obj.release()); |
847 EXPECT_EQ(1u, dict_obj->GetObjNum()); | 840 EXPECT_EQ(1u, dict_obj->GetObjNum()); |
848 ASSERT_TRUE(elem0); | 841 ASSERT_TRUE(elem0); |
849 ASSERT_TRUE(elem0->IsReference()); | 842 ASSERT_TRUE(elem0->IsReference()); |
850 EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); | 843 EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); |
851 EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); | 844 EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); |
852 | 845 |
853 // Clone this object to see whether stack overflow will be triggered. | 846 // Clone this object to see whether stack overflow will be triggered. |
854 std::unique_ptr<CPDF_Dictionary> cloned_dict = | 847 std::unique_ptr<CPDF_Dictionary> cloned_dict = |
(...skipping 16 matching lines...) Expand all Loading... |
871 dict->SetFor("clams", pObj); | 864 dict->SetFor("clams", pObj); |
872 dict->ConvertToIndirectObjectFor("clams", &objects_holder); | 865 dict->ConvertToIndirectObjectFor("clams", &objects_holder); |
873 CPDF_Object* pRef = dict->GetObjectFor("clams"); | 866 CPDF_Object* pRef = dict->GetObjectFor("clams"); |
874 CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); | 867 CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); |
875 EXPECT_TRUE(pRef->IsReference()); | 868 EXPECT_TRUE(pRef->IsReference()); |
876 EXPECT_TRUE(pNum->IsNumber()); | 869 EXPECT_TRUE(pNum->IsNumber()); |
877 EXPECT_NE(pObj, pRef); | 870 EXPECT_NE(pObj, pRef); |
878 EXPECT_EQ(pObj, pNum); | 871 EXPECT_EQ(pObj, pNum); |
879 EXPECT_EQ(42, dict->GetIntegerFor("clams")); | 872 EXPECT_EQ(42, dict->GetIntegerFor("clams")); |
880 } | 873 } |
OLD | NEW |