| 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   94     for (size_t i = 0; i < FX_ArraySize(objs); ++i) |   94     for (size_t i = 0; i < FX_ArraySize(objs); ++i) | 
|   95       m_DirectObjs.emplace_back(objs[i]); |   95       m_DirectObjs.emplace_back(objs[i]); | 
|   96  |   96  | 
|   97     // Indirect references to indirect objects. |   97     // Indirect references to indirect objects. | 
|   98     m_ObjHolder.reset(new CPDF_IndirectObjectHolder()); |   98     m_ObjHolder.reset(new CPDF_IndirectObjectHolder()); | 
|   99     m_IndirectObjs = {boolean_true_obj->Clone(), number_int_obj->Clone(), |   99     m_IndirectObjs = {boolean_true_obj->Clone(), number_int_obj->Clone(), | 
|  100                       str_spec_obj->Clone(),     name_obj->Clone(), |  100                       str_spec_obj->Clone(),     name_obj->Clone(), | 
|  101                       m_ArrayObj->Clone(),       m_DictObj->Clone(), |  101                       m_ArrayObj->Clone(),       m_DictObj->Clone(), | 
|  102                       stream_obj->Clone()}; |  102                       stream_obj->Clone()}; | 
|  103     for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { |  103     for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { | 
|  104       m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]); |  104       m_ObjHolder->AddIndirectObject(UniqueObject(m_IndirectObjs[i])); | 
|  105       m_RefObjs.emplace_back(new CPDF_Reference( |  105       m_RefObjs.emplace_back(new CPDF_Reference( | 
|  106           m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); |  106           m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); | 
|  107     } |  107     } | 
|  108   } |  108   } | 
|  109  |  109  | 
|  110   bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { |  110   bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { | 
|  111     if (obj1 == obj2) |  111     if (obj1 == obj2) | 
|  112       return true; |  112       return true; | 
|  113     if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) |  113     if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) | 
|  114       return false; |  114       return false; | 
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  723   CPDF_Name* name_obj = new CPDF_Name("Title:"); |  723   CPDF_Name* name_obj = new CPDF_Name("Title:"); | 
|  724   CPDF_Null* null_obj = new CPDF_Null(); |  724   CPDF_Null* null_obj = new CPDF_Null(); | 
|  725   CPDF_Object* indirect_objs[] = {boolean_obj, int_obj,  float_obj, |  725   CPDF_Object* indirect_objs[] = {boolean_obj, int_obj,  float_obj, | 
|  726                                   str_obj,     name_obj, null_obj}; |  726                                   str_obj,     name_obj, null_obj}; | 
|  727   unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; |  727   unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; | 
|  728   ScopedArray arr(new CPDF_Array); |  728   ScopedArray arr(new CPDF_Array); | 
|  729   ScopedArray arr1(new CPDF_Array); |  729   ScopedArray arr1(new CPDF_Array); | 
|  730   // Create two arrays of references by different AddReference() APIs. |  730   // Create two arrays of references by different AddReference() APIs. | 
|  731   for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { |  731   for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { | 
|  732     // All the indirect objects inserted will be owned by holder. |  732     // All the indirect objects inserted will be owned by holder. | 
|  733     holder->ReplaceIndirectObjectIfHigherGeneration(obj_nums[i], |  733     holder->ReplaceIndirectObjectIfHigherGeneration( | 
|  734                                                     indirect_objs[i]); |  734         obj_nums[i], UniqueObject(indirect_objs[i])); | 
|  735     arr->AddReference(holder.get(), obj_nums[i]); |  735     arr->AddReference(holder.get(), obj_nums[i]); | 
|  736     arr1->AddReference(holder.get(), indirect_objs[i]->GetObjNum()); |  736     arr1->AddReference(holder.get(), indirect_objs[i]->GetObjNum()); | 
|  737   } |  737   } | 
|  738   // Check indirect objects. |  738   // Check indirect objects. | 
|  739   for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) |  739   for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) | 
|  740     EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); |  740     EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); | 
|  741   // Check arrays. |  741   // Check arrays. | 
|  742   EXPECT_EQ(arr->GetCount(), arr1->GetCount()); |  742   EXPECT_EQ(arr->GetCount(), arr1->GetCount()); | 
|  743   for (size_t i = 0; i < arr->GetCount(); ++i) { |  743   for (size_t i = 0; i < arr->GetCount(); ++i) { | 
|  744     EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); |  744     EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  834     ASSERT_TRUE(cloned_stream); |  834     ASSERT_TRUE(cloned_stream); | 
|  835     CPDF_Object* cloned_dict = cloned_stream->GetDict(); |  835     CPDF_Object* cloned_dict = cloned_stream->GetDict(); | 
|  836     ASSERT_TRUE(cloned_dict); |  836     ASSERT_TRUE(cloned_dict); | 
|  837     ASSERT_TRUE(cloned_dict->IsDictionary()); |  837     ASSERT_TRUE(cloned_dict->IsDictionary()); | 
|  838     // Recursively referenced object is not cloned. |  838     // Recursively referenced object is not cloned. | 
|  839     EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); |  839     EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); | 
|  840   } |  840   } | 
|  841   { |  841   { | 
|  842     CPDF_IndirectObjectHolder objects_holder; |  842     CPDF_IndirectObjectHolder objects_holder; | 
|  843     // Create an object with a reference loop. |  843     // Create an object with a reference loop. | 
|  844     CPDF_Dictionary* dict_obj = new CPDF_Dictionary(); |  844     CPDF_Dictionary* dict_obj = objects_holder.AddIndirectDictionary(); | 
|  845     CPDF_Array* arr_obj = new CPDF_Array; |  845     CPDF_Array* arr_obj = new CPDF_Array; | 
|  846     objects_holder.AddIndirectObject(dict_obj); |  | 
|  847     EXPECT_EQ(1u, dict_obj->GetObjNum()); |  846     EXPECT_EQ(1u, dict_obj->GetObjNum()); | 
|  848     dict_obj->SetFor("arr", arr_obj); |  847     dict_obj->SetFor("arr", arr_obj); | 
|  849     arr_obj->InsertAt( |  848     arr_obj->InsertAt( | 
|  850         0, new CPDF_Reference(&objects_holder, dict_obj->GetObjNum())); |  849         0, new CPDF_Reference(&objects_holder, dict_obj->GetObjNum())); | 
|  851     CPDF_Object* elem0 = arr_obj->GetObjectAt(0); |  850     CPDF_Object* elem0 = arr_obj->GetObjectAt(0); | 
|  852     ASSERT_TRUE(elem0); |  851     ASSERT_TRUE(elem0); | 
|  853     ASSERT_TRUE(elem0->IsReference()); |  852     ASSERT_TRUE(elem0->IsReference()); | 
|  854     EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); |  853     EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); | 
|  855     EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); |  854     EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); | 
|  856  |  855  | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|  874   dict->SetFor("clams", pObj); |  873   dict->SetFor("clams", pObj); | 
|  875   dict->ConvertToIndirectObjectFor("clams", &objects_holder); |  874   dict->ConvertToIndirectObjectFor("clams", &objects_holder); | 
|  876   CPDF_Object* pRef = dict->GetObjectFor("clams"); |  875   CPDF_Object* pRef = dict->GetObjectFor("clams"); | 
|  877   CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); |  876   CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); | 
|  878   EXPECT_TRUE(pRef->IsReference()); |  877   EXPECT_TRUE(pRef->IsReference()); | 
|  879   EXPECT_TRUE(pNum->IsNumber()); |  878   EXPECT_TRUE(pNum->IsNumber()); | 
|  880   EXPECT_NE(pObj, pRef); |  879   EXPECT_NE(pObj, pRef); | 
|  881   EXPECT_EQ(pObj, pNum); |  880   EXPECT_EQ(pObj, pNum); | 
|  882   EXPECT_EQ(42, dict->GetIntegerFor("clams")); |  881   EXPECT_EQ(42, dict->GetIntegerFor("clams")); | 
|  883 } |  882 } | 
| OLD | NEW |