Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: core/fpdfapi/parser/cpdf_object_unittest.cpp

Issue 2489283003: Make AddIndirectObject() take a unique_ptr. (Closed)
Patch Set: Fix test Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 stream_obj, null_obj}; 83 stream_obj, null_obj};
84 m_DirectObjTypes = { 84 m_DirectObjTypes = {
85 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, 85 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER,
86 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, 86 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING,
87 CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, 87 CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY,
88 CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; 88 CPDF_Object::STREAM, CPDF_Object::NULLOBJ};
89 for (size_t i = 0; i < FX_ArraySize(objs); ++i) 89 for (size_t i = 0; i < FX_ArraySize(objs); ++i)
90 m_DirectObjs.emplace_back(objs[i]); 90 m_DirectObjs.emplace_back(objs[i]);
91 91
92 // Indirect references to indirect objects. 92 // Indirect references to indirect objects.
93 m_ObjHolder.reset(new CPDF_IndirectObjectHolder()); 93 m_ObjHolder = pdfium::MakeUnique<CPDF_IndirectObjectHolder>();
94 m_IndirectObjs = { 94 m_IndirectObjs = {m_ObjHolder->AddIndirectObject(boolean_true_obj->Clone()),
95 boolean_true_obj->Clone().release(), number_int_obj->Clone().release(), 95 m_ObjHolder->AddIndirectObject(number_int_obj->Clone()),
96 str_spec_obj->Clone().release(), name_obj->Clone().release(), 96 m_ObjHolder->AddIndirectObject(str_spec_obj->Clone()),
97 m_ArrayObj->Clone().release(), m_DictObj->Clone().release(), 97 m_ObjHolder->AddIndirectObject(name_obj->Clone()),
98 stream_obj->Clone().release()}; 98 m_ObjHolder->AddIndirectObject(m_ArrayObj->Clone()),
99 for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { 99 m_ObjHolder->AddIndirectObject(m_DictObj->Clone()),
100 m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]); 100 m_ObjHolder->AddIndirectObject(stream_obj->Clone())};
101 m_RefObjs.emplace_back(new CPDF_Reference( 101 for (CPDF_Object* pObj : m_IndirectObjs) {
102 m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); 102 m_RefObjs.emplace_back(
103 new CPDF_Reference(m_ObjHolder.get(), pObj->GetObjNum()));
103 } 104 }
104 } 105 }
105 106
106 bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { 107 bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) {
107 if (obj1 == obj2) 108 if (obj1 == obj2)
108 return true; 109 return true;
109 if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) 110 if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType())
110 return false; 111 return false;
111 switch (obj1->GetType()) { 112 switch (obj1->GetType()) {
112 case CPDF_Object::BOOLEAN: 113 case CPDF_Object::BOOLEAN:
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 ASSERT_TRUE(cloned_stream); 831 ASSERT_TRUE(cloned_stream);
831 CPDF_Object* cloned_dict = cloned_stream->GetDict(); 832 CPDF_Object* cloned_dict = cloned_stream->GetDict();
832 ASSERT_TRUE(cloned_dict); 833 ASSERT_TRUE(cloned_dict);
833 ASSERT_TRUE(cloned_dict->IsDictionary()); 834 ASSERT_TRUE(cloned_dict->IsDictionary());
834 // Recursively referenced object is not cloned. 835 // Recursively referenced object is not cloned.
835 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); 836 EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream"));
836 } 837 }
837 { 838 {
838 CPDF_IndirectObjectHolder objects_holder; 839 CPDF_IndirectObjectHolder objects_holder;
839 // Create an object with a reference loop. 840 // Create an object with a reference loop.
840 CPDF_Dictionary* dict_obj = new CPDF_Dictionary(); 841 CPDF_Dictionary* dict_obj = objects_holder.NewIndirect<CPDF_Dictionary>();
841 CPDF_Array* arr_obj = new CPDF_Array; 842 std::unique_ptr<CPDF_Array> arr_obj = pdfium::MakeUnique<CPDF_Array>();
842 objects_holder.AddIndirectObject(dict_obj);
843 EXPECT_EQ(1u, dict_obj->GetObjNum());
844 dict_obj->SetFor("arr", arr_obj);
845 arr_obj->InsertAt( 843 arr_obj->InsertAt(
846 0, new CPDF_Reference(&objects_holder, dict_obj->GetObjNum())); 844 0, new CPDF_Reference(&objects_holder, dict_obj->GetObjNum()));
847 CPDF_Object* elem0 = arr_obj->GetObjectAt(0); 845 CPDF_Object* elem0 = arr_obj->GetObjectAt(0);
846 dict_obj->SetFor("arr", arr_obj.release());
847 EXPECT_EQ(1u, dict_obj->GetObjNum());
848 ASSERT_TRUE(elem0); 848 ASSERT_TRUE(elem0);
849 ASSERT_TRUE(elem0->IsReference()); 849 ASSERT_TRUE(elem0->IsReference());
850 EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); 850 EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum());
851 EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); 851 EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect());
852 852
853 // Clone this object to see whether stack overflow will be triggered. 853 // Clone this object to see whether stack overflow will be triggered.
854 std::unique_ptr<CPDF_Dictionary> cloned_dict = 854 std::unique_ptr<CPDF_Dictionary> cloned_dict =
855 ToDictionary(dict_obj->CloneDirectObject()); 855 ToDictionary(dict_obj->CloneDirectObject());
856 // Cloned object should be the same as the original. 856 // Cloned object should be the same as the original.
857 ASSERT_TRUE(cloned_dict); 857 ASSERT_TRUE(cloned_dict);
(...skipping 13 matching lines...) Expand all
871 dict->SetFor("clams", pObj); 871 dict->SetFor("clams", pObj);
872 dict->ConvertToIndirectObjectFor("clams", &objects_holder); 872 dict->ConvertToIndirectObjectFor("clams", &objects_holder);
873 CPDF_Object* pRef = dict->GetObjectFor("clams"); 873 CPDF_Object* pRef = dict->GetObjectFor("clams");
874 CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); 874 CPDF_Object* pNum = dict->GetDirectObjectFor("clams");
875 EXPECT_TRUE(pRef->IsReference()); 875 EXPECT_TRUE(pRef->IsReference());
876 EXPECT_TRUE(pNum->IsNumber()); 876 EXPECT_TRUE(pNum->IsNumber());
877 EXPECT_NE(pObj, pRef); 877 EXPECT_NE(pObj, pRef);
878 EXPECT_EQ(pObj, pNum); 878 EXPECT_EQ(pObj, pNum);
879 EXPECT_EQ(42, dict->GetIntegerFor("clams")); 879 EXPECT_EQ(42, dict->GetIntegerFor("clams"));
880 } 880 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698