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/fpdf_parser/cpdf_object_unittest.cpp

Issue 2375343004: Assert that only 0-numbered objects are Released() (Closed)
Patch Set: brute-force delete unowned numbered object in one place Created 4 years, 2 months 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/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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698