| Index: core/fpdfapi/parser/cpdf_object_unittest.cpp
|
| diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
|
| index 2de6256912f8932f077732765e90b045cb27a0de..86645934bfa69de4ac73592f904eeaafef05b07e 100644
|
| --- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
|
| +++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
|
| @@ -14,6 +14,7 @@
|
|
|
| #include <memory>
|
| #include <string>
|
| +#include <utility>
|
| #include <vector>
|
|
|
| #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
|
| @@ -53,8 +54,8 @@ class PDFObjectsTest : public testing::Test {
|
| CPDF_Number* number_int_obj = new CPDF_Number(1245);
|
| CPDF_Number* number_float_obj = new CPDF_Number(9.00345f);
|
| // String objects.
|
| - CPDF_String* str_reg_obj = new CPDF_String(L"A simple test");
|
| - CPDF_String* str_spec_obj = new CPDF_String(L"\t\n");
|
| + CPDF_String* str_reg_obj = new CPDF_String(nullptr, L"A simple test");
|
| + CPDF_String* str_spec_obj = new CPDF_String(nullptr, L"\t\n");
|
| // Name object.
|
| CPDF_Name* name_obj = new CPDF_Name(nullptr, "space");
|
| // Array object.
|
| @@ -63,16 +64,16 @@ class PDFObjectsTest : public testing::Test {
|
| m_ArrayObj->InsertNewAt<CPDF_Name>(1, "address");
|
| // Dictionary object.
|
| m_DictObj = new CPDF_Dictionary();
|
| - m_DictObj->SetFor("bool", new CPDF_Boolean(false));
|
| - m_DictObj->SetFor("num", new CPDF_Number(0.23f));
|
| + m_DictObj->SetNewFor<CPDF_Boolean>("bool", false);
|
| + m_DictObj->SetNewFor<CPDF_Number>("num", 0.23f);
|
| // Stream object.
|
| const char content[] = "abcdefghijklmnopqrstuvwxyz";
|
| size_t buf_len = FX_ArraySize(content);
|
| uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len));
|
| memcpy(buf, content, buf_len);
|
| m_StreamDictObj = new CPDF_Dictionary();
|
| - m_StreamDictObj->SetFor("key1", new CPDF_String(L" test dict"));
|
| - m_StreamDictObj->SetFor("key2", new CPDF_Number(-1));
|
| + m_StreamDictObj->SetNewFor<CPDF_String>("key1", L" test dict");
|
| + m_StreamDictObj->SetNewFor<CPDF_Number>("key2", -1);
|
| CPDF_Stream* stream_obj = new CPDF_Stream(buf, buf_len, m_StreamDictObj);
|
| // Null Object.
|
| CPDF_Null* null_obj = new CPDF_Null;
|
| @@ -136,7 +137,7 @@ class PDFObjectsTest : public testing::Test {
|
| return false;
|
| for (CPDF_Dictionary::const_iterator it = dict1->begin();
|
| it != dict1->end(); ++it) {
|
| - if (!Equal(it->second, dict2->GetObjectFor(it->first)))
|
| + if (!Equal(it->second.get(), dict2->GetObjectFor(it->first)))
|
| return false;
|
| }
|
| return true;
|
| @@ -555,7 +556,7 @@ TEST(PDFArrayTest, GetTypeAt) {
|
| char buf[33];
|
| key.append(FXSYS_itoa(j, buf, 10));
|
| int value = j + 200;
|
| - vals[i]->SetFor(key.c_str(), new CPDF_Number(value));
|
| + vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value);
|
| }
|
| }
|
| for (size_t i = 0; i < 3; ++i) {
|
| @@ -581,7 +582,7 @@ TEST(PDFArrayTest, GetTypeAt) {
|
| char buf[33];
|
| key.append(FXSYS_itoa(j, buf, 10));
|
| int value = j + 200;
|
| - vals[i]->SetFor(key.c_str(), new CPDF_Number(value));
|
| + vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value);
|
| }
|
| uint8_t content[] = "content: this is a stream";
|
| size_t data_size = FX_ArraySize(content);
|
| @@ -620,12 +621,12 @@ TEST(PDFArrayTest, GetTypeAt) {
|
| arr_val->AddNew<CPDF_Number>(2);
|
|
|
| CPDF_Dictionary* dict_val = arr->InsertNewAt<CPDF_Dictionary>(12);
|
| - dict_val->SetFor("key1", new CPDF_String(nullptr, "Linda", false));
|
| - dict_val->SetFor("key2", new CPDF_String(nullptr, "Zoe", false));
|
| + dict_val->SetNewFor<CPDF_String>("key1", "Linda", false);
|
| + dict_val->SetNewFor<CPDF_String>("key2", "Zoe", false);
|
|
|
| CPDF_Dictionary* stream_dict = new CPDF_Dictionary();
|
| - stream_dict->SetFor("key1", new CPDF_String(nullptr, "John", false));
|
| - stream_dict->SetFor("key2", new CPDF_String(nullptr, "King", false));
|
| + stream_dict->SetNewFor<CPDF_String>("key1", "John", false);
|
| + stream_dict->SetNewFor<CPDF_String>("key2", "King", false);
|
| uint8_t data[] = "A stream for test";
|
| // The data buffer will be owned by stream object, so it needs to be
|
| // dynamically allocated.
|
| @@ -778,7 +779,7 @@ TEST(PDFArrayTest, ConvertIndirect) {
|
| TEST(PDFDictionaryTest, CloneDirectObject) {
|
| CPDF_IndirectObjectHolder objects_holder;
|
| std::unique_ptr<CPDF_Dictionary> dict(new CPDF_Dictionary());
|
| - dict->SetReferenceFor("foo", &objects_holder, 1234);
|
| + dict->SetNewFor<CPDF_Reference>("foo", &objects_holder, 1234);
|
| ASSERT_EQ(1U, dict->GetCount());
|
| CPDF_Object* obj = dict->GetObjectFor("foo");
|
| ASSERT_TRUE(obj);
|
| @@ -797,10 +798,12 @@ TEST(PDFDictionaryTest, CloneDirectObject) {
|
|
|
| TEST(PDFObjectTest, CloneCheckLoop) {
|
| {
|
| - // Create a dictionary/array pair with a reference loop.
|
| + // Create a dictionary/array pair with a reference loop. It takes
|
| + // some work to do this nowadays, in particular we need the
|
| + // anti-pattern pdfium::WrapUnique(arr.get()).
|
| auto arr_obj = pdfium::MakeUnique<CPDF_Array>();
|
| CPDF_Dictionary* dict_obj = arr_obj->InsertNewAt<CPDF_Dictionary>(0);
|
| - dict_obj->SetFor("arr", arr_obj.get());
|
| + dict_obj->SetFor("arr", pdfium::WrapUnique(arr_obj.get()));
|
| // Clone this object to see whether stack overflow will be triggered.
|
| std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone());
|
| // Cloned object should be the same as the original.
|
| @@ -814,11 +817,9 @@ TEST(PDFObjectTest, CloneCheckLoop) {
|
| }
|
| {
|
| // Create a dictionary/stream pair with a reference loop.
|
| - CPDF_Dictionary* dict_obj = new CPDF_Dictionary();
|
| - std::unique_ptr<CPDF_Stream> stream_obj(
|
| - new CPDF_Stream(nullptr, 0, dict_obj));
|
| - dict_obj->SetFor("stream", stream_obj.get());
|
| -
|
| + auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>();
|
| + CPDF_Stream* stream_obj =
|
| + dict_obj->SetNewFor<CPDF_Stream>("stream", nullptr, 0, dict_obj.get());
|
| // Clone this object to see whether stack overflow will be triggered.
|
| std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone());
|
| // Cloned object should be the same as the original.
|
| @@ -837,7 +838,7 @@ TEST(PDFObjectTest, CloneCheckLoop) {
|
| arr_obj->InsertNewAt<CPDF_Reference>(0, &objects_holder,
|
| dict_obj->GetObjNum());
|
| CPDF_Object* elem0 = arr_obj->GetObjectAt(0);
|
| - dict_obj->SetFor("arr", arr_obj.release());
|
| + dict_obj->SetFor("arr", std::move(arr_obj));
|
| EXPECT_EQ(1u, dict_obj->GetObjNum());
|
| ASSERT_TRUE(elem0);
|
| ASSERT_TRUE(elem0->IsReference());
|
| @@ -861,8 +862,7 @@ TEST(PDFObjectTest, CloneCheckLoop) {
|
| TEST(PDFDictionaryTest, ConvertIndirect) {
|
| CPDF_IndirectObjectHolder objects_holder;
|
| std::unique_ptr<CPDF_Dictionary> dict(new CPDF_Dictionary);
|
| - CPDF_Object* pObj = new CPDF_Number(42);
|
| - dict->SetFor("clams", pObj);
|
| + CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("clams", 42);
|
| dict->ConvertToIndirectObjectFor("clams", &objects_holder);
|
| CPDF_Object* pRef = dict->GetObjectFor("clams");
|
| CPDF_Object* pNum = dict->GetDirectObjectFor("clams");
|
|
|