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/fpdf_parser/cpdf_array.h" | 5 #include "core/fpdfapi/fpdf_parser/cpdf_array.h" |
6 #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h" | 6 #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h" |
7 #include "core/fpdfapi/fpdf_parser/cpdf_dictionary.h" | 7 #include "core/fpdfapi/fpdf_parser/cpdf_dictionary.h" |
8 #include "core/fpdfapi/fpdf_parser/cpdf_name.h" | 8 #include "core/fpdfapi/fpdf_parser/cpdf_name.h" |
9 #include "core/fpdfapi/fpdf_parser/cpdf_null.h" | 9 #include "core/fpdfapi/fpdf_parser/cpdf_null.h" |
10 #include "core/fpdfapi/fpdf_parser/cpdf_number.h" | 10 #include "core/fpdfapi/fpdf_parser/cpdf_number.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 m_DirectObjTypes = { | 88 m_DirectObjTypes = { |
89 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, | 89 CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, |
90 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, | 90 CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, |
91 CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, | 91 CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, |
92 CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; | 92 CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; |
93 for (size_t i = 0; i < FX_ArraySize(objs); ++i) | 93 for (size_t i = 0; i < FX_ArraySize(objs); ++i) |
94 m_DirectObjs.emplace_back(objs[i]); | 94 m_DirectObjs.emplace_back(objs[i]); |
95 | 95 |
96 // Indirect references to indirect objects. | 96 // Indirect references to indirect objects. |
97 m_ObjHolder.reset(new CPDF_IndirectObjectHolder()); | 97 m_ObjHolder.reset(new CPDF_IndirectObjectHolder()); |
98 m_IndirectObjs = {boolean_true_obj, number_int_obj, str_spec_obj, name_obj, | 98 m_IndirectObjs = {boolean_true_obj->Clone(), number_int_obj->Clone(), |
99 m_ArrayObj, m_DictObj, stream_obj}; | 99 str_spec_obj->Clone(), name_obj->Clone(), |
| 100 m_ArrayObj->Clone(), m_DictObj->Clone(), |
| 101 stream_obj->Clone()}; |
100 for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { | 102 for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { |
101 m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]); | 103 m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]); |
102 m_RefObjs.emplace_back(new CPDF_Reference( | 104 m_RefObjs.emplace_back(new CPDF_Reference( |
103 m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); | 105 m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); |
104 } | 106 } |
105 } | 107 } |
106 | 108 |
107 bool Equal(CPDF_Object* obj1, CPDF_Object* obj2) { | 109 bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { |
108 if (obj1 == obj2) | 110 if (obj1 == obj2) |
109 return true; | 111 return true; |
110 if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) | 112 if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) |
111 return false; | 113 return false; |
112 switch (obj1->GetType()) { | 114 switch (obj1->GetType()) { |
113 case CPDF_Object::BOOLEAN: | 115 case CPDF_Object::BOOLEAN: |
114 return obj1->GetInteger() == obj2->GetInteger(); | 116 return obj1->GetInteger() == obj2->GetInteger(); |
115 case CPDF_Object::NUMBER: | 117 case CPDF_Object::NUMBER: |
116 return obj1->AsNumber()->IsInteger() == obj2->AsNumber()->IsInteger() && | 118 return obj1->AsNumber()->IsInteger() == obj2->AsNumber()->IsInteger() && |
117 obj1->GetInteger() == obj2->GetInteger(); | 119 obj1->GetInteger() == obj2->GetInteger(); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | 248 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, |
247 nullptr, nullptr, m_DictObj, m_StreamDictObj, nullptr}; | 249 nullptr, nullptr, m_DictObj, m_StreamDictObj, nullptr}; |
248 // Check for direct objects. | 250 // Check for direct objects. |
249 for (size_t i = 0; i < m_DirectObjs.size(); ++i) | 251 for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
250 EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetDict()); | 252 EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetDict()); |
251 | 253 |
252 // Check indirect references. | 254 // Check indirect references. |
253 const CPDF_Dictionary* const indirect_obj_results[] = { | 255 const CPDF_Dictionary* const indirect_obj_results[] = { |
254 nullptr, nullptr, nullptr, nullptr, nullptr, m_DictObj, m_StreamDictObj}; | 256 nullptr, nullptr, nullptr, nullptr, nullptr, m_DictObj, m_StreamDictObj}; |
255 for (size_t i = 0; i < m_RefObjs.size(); ++i) | 257 for (size_t i = 0; i < m_RefObjs.size(); ++i) |
256 EXPECT_EQ(indirect_obj_results[i], m_RefObjs[i]->GetDict()); | 258 EXPECT_TRUE(Equal(indirect_obj_results[i], m_RefObjs[i]->GetDict())); |
257 } | 259 } |
258 | 260 |
259 TEST_F(PDFObjectsTest, GetArray) { | 261 TEST_F(PDFObjectsTest, GetArray) { |
260 const CPDF_Array* const direct_obj_results[] = { | 262 const CPDF_Array* const direct_obj_results[] = { |
261 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | 263 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, |
262 nullptr, m_ArrayObj, nullptr, nullptr, nullptr}; | 264 nullptr, m_ArrayObj, nullptr, nullptr, nullptr}; |
263 // Check for direct objects. | 265 // Check for direct objects. |
264 for (size_t i = 0; i < m_DirectObjs.size(); ++i) | 266 for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
265 EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->AsArray()); | 267 EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->AsArray()); |
266 | 268 |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 // Cloned object should be the same as the original. | 832 // Cloned object should be the same as the original. |
831 ASSERT_TRUE(cloned_dict); | 833 ASSERT_TRUE(cloned_dict); |
832 CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr"); | 834 CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr"); |
833 ASSERT_TRUE(cloned_arr); | 835 ASSERT_TRUE(cloned_arr); |
834 ASSERT_TRUE(cloned_arr->IsArray()); | 836 ASSERT_TRUE(cloned_arr->IsArray()); |
835 EXPECT_EQ(1u, cloned_arr->AsArray()->GetCount()); | 837 EXPECT_EQ(1u, cloned_arr->AsArray()->GetCount()); |
836 // Recursively referenced object is not cloned. | 838 // Recursively referenced object is not cloned. |
837 EXPECT_EQ(nullptr, cloned_arr->AsArray()->GetObjectAt(0)); | 839 EXPECT_EQ(nullptr, cloned_arr->AsArray()->GetObjectAt(0)); |
838 } | 840 } |
839 } | 841 } |
OLD | NEW |