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_document.h" | 5 #include "core/fpdfapi/parser/cpdf_document.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "core/fpdfapi/cpdf_modulemgr.h" | 9 #include "core/fpdfapi/cpdf_modulemgr.h" |
10 #include "core/fpdfapi/parser/cpdf_array.h" | 10 #include "core/fpdfapi/parser/cpdf_array.h" |
11 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 11 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
12 #include "core/fpdfapi/parser/cpdf_linearized_header.h" | 12 #include "core/fpdfapi/parser/cpdf_linearized_header.h" |
13 #include "core/fpdfapi/parser/cpdf_parser.h" | 13 #include "core/fpdfapi/parser/cpdf_parser.h" |
| 14 #include "core/fpdfapi/parser/cpdf_reference.h" |
14 #include "core/fxcrt/fx_memory.h" | 15 #include "core/fxcrt/fx_memory.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/base/ptr_util.h" | 17 #include "third_party/base/ptr_util.h" |
17 | 18 |
18 namespace { | 19 namespace { |
19 | 20 |
20 CPDF_Dictionary* CreatePageTreeNode(std::unique_ptr<CPDF_Array> kids, | 21 CPDF_Dictionary* CreatePageTreeNode(std::unique_ptr<CPDF_Array> kids, |
21 CPDF_Document* pDoc, | 22 CPDF_Document* pDoc, |
22 int count) { | 23 int count) { |
23 CPDF_Array* pUnowned = pDoc->AddIndirectObject(std::move(kids))->AsArray(); | 24 CPDF_Array* pUnowned = pDoc->AddIndirectObject(std::move(kids))->AsArray(); |
(...skipping 11 matching lines...) Expand all Loading... |
35 page->SetStringFor("Type", "Page"); | 36 page->SetStringFor("Type", "Page"); |
36 page->SetIntegerFor("PageNumbering", number); | 37 page->SetIntegerFor("PageNumbering", number); |
37 return page; | 38 return page; |
38 } | 39 } |
39 | 40 |
40 class CPDF_TestDocumentForPages : public CPDF_Document { | 41 class CPDF_TestDocumentForPages : public CPDF_Document { |
41 public: | 42 public: |
42 CPDF_TestDocumentForPages() : CPDF_Document(nullptr) { | 43 CPDF_TestDocumentForPages() : CPDF_Document(nullptr) { |
43 // Set up test | 44 // Set up test |
44 auto zeroToTwo = pdfium::MakeUnique<CPDF_Array>(); | 45 auto zeroToTwo = pdfium::MakeUnique<CPDF_Array>(); |
45 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(0))); | 46 zeroToTwo->AddNew<CPDF_Reference>( |
46 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(1))); | 47 this, AddIndirectObject(CreateNumberedPage(0))->GetObjNum()); |
47 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(2))); | 48 zeroToTwo->AddNew<CPDF_Reference>( |
| 49 this, AddIndirectObject(CreateNumberedPage(1))->GetObjNum()); |
| 50 zeroToTwo->AddNew<CPDF_Reference>( |
| 51 this, AddIndirectObject(CreateNumberedPage(2))->GetObjNum()); |
48 CPDF_Dictionary* branch1 = | 52 CPDF_Dictionary* branch1 = |
49 CreatePageTreeNode(std::move(zeroToTwo), this, 3); | 53 CreatePageTreeNode(std::move(zeroToTwo), this, 3); |
50 | 54 |
51 auto zeroToThree = pdfium::MakeUnique<CPDF_Array>(); | 55 auto zeroToThree = pdfium::MakeUnique<CPDF_Array>(); |
52 zeroToThree->AddReference(this, branch1->GetObjNum()); | 56 zeroToThree->AddNew<CPDF_Reference>(this, branch1->GetObjNum()); |
53 zeroToThree->AddReference(this, AddIndirectObject(CreateNumberedPage(3))); | 57 zeroToThree->AddNew<CPDF_Reference>( |
| 58 this, AddIndirectObject(CreateNumberedPage(3))->GetObjNum()); |
54 CPDF_Dictionary* branch2 = | 59 CPDF_Dictionary* branch2 = |
55 CreatePageTreeNode(std::move(zeroToThree), this, 4); | 60 CreatePageTreeNode(std::move(zeroToThree), this, 4); |
56 | 61 |
57 auto fourFive = pdfium::MakeUnique<CPDF_Array>(); | 62 auto fourFive = pdfium::MakeUnique<CPDF_Array>(); |
58 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(4))); | 63 fourFive->AddNew<CPDF_Reference>( |
59 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(5))); | 64 this, AddIndirectObject(CreateNumberedPage(4))->GetObjNum()); |
| 65 fourFive->AddNew<CPDF_Reference>( |
| 66 this, AddIndirectObject(CreateNumberedPage(5))->GetObjNum()); |
60 CPDF_Dictionary* branch3 = CreatePageTreeNode(std::move(fourFive), this, 2); | 67 CPDF_Dictionary* branch3 = CreatePageTreeNode(std::move(fourFive), this, 2); |
61 | 68 |
62 auto justSix = pdfium::MakeUnique<CPDF_Array>(); | 69 auto justSix = pdfium::MakeUnique<CPDF_Array>(); |
63 justSix->AddReference(this, AddIndirectObject(CreateNumberedPage(6))); | 70 justSix->AddNew<CPDF_Reference>( |
| 71 this, AddIndirectObject(CreateNumberedPage(6))->GetObjNum()); |
64 CPDF_Dictionary* branch4 = CreatePageTreeNode(std::move(justSix), this, 1); | 72 CPDF_Dictionary* branch4 = CreatePageTreeNode(std::move(justSix), this, 1); |
65 | 73 |
66 auto allPages = pdfium::MakeUnique<CPDF_Array>(); | 74 auto allPages = pdfium::MakeUnique<CPDF_Array>(); |
67 allPages->AddReference(this, branch2); | 75 allPages->AddNew<CPDF_Reference>(this, branch2->GetObjNum()); |
68 allPages->AddReference(this, branch3); | 76 allPages->AddNew<CPDF_Reference>(this, branch3->GetObjNum()); |
69 allPages->AddReference(this, branch4); | 77 allPages->AddNew<CPDF_Reference>(this, branch4->GetObjNum()); |
70 CPDF_Dictionary* pagesDict = | 78 CPDF_Dictionary* pagesDict = |
71 CreatePageTreeNode(std::move(allPages), this, 7); | 79 CreatePageTreeNode(std::move(allPages), this, 7); |
72 | 80 |
73 m_pOwnedRootDict = pdfium::MakeUnique<CPDF_Dictionary>(); | 81 m_pOwnedRootDict = pdfium::MakeUnique<CPDF_Dictionary>(); |
74 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict); | 82 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict); |
75 m_pRootDict = m_pOwnedRootDict.get(); | 83 m_pRootDict = m_pOwnedRootDict.get(); |
76 m_PageList.SetSize(7); | 84 m_PageList.SetSize(7); |
77 } | 85 } |
78 | 86 |
79 private: | 87 private: |
80 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; | 88 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; |
81 }; | 89 }; |
82 | 90 |
83 class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document { | 91 class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document { |
84 public: | 92 public: |
85 CPDF_TestDocumentWithPageWithoutPageNum() : CPDF_Document(nullptr) { | 93 CPDF_TestDocumentWithPageWithoutPageNum() : CPDF_Document(nullptr) { |
86 // Set up test | 94 // Set up test |
87 auto allPages = pdfium::MakeUnique<CPDF_Array>(); | 95 auto allPages = pdfium::MakeUnique<CPDF_Array>(); |
88 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(0))); | 96 allPages->AddNew<CPDF_Reference>( |
89 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(1))); | 97 this, AddIndirectObject(CreateNumberedPage(0))->GetObjNum()); |
| 98 allPages->AddNew<CPDF_Reference>( |
| 99 this, AddIndirectObject(CreateNumberedPage(1))->GetObjNum()); |
90 // Page without pageNum. | 100 // Page without pageNum. |
91 allPages->Add(CreateNumberedPage(2).release()); | 101 allPages->Add(CreateNumberedPage(2)); |
92 CPDF_Dictionary* pagesDict = | 102 CPDF_Dictionary* pagesDict = |
93 CreatePageTreeNode(std::move(allPages), this, 3); | 103 CreatePageTreeNode(std::move(allPages), this, 3); |
94 m_pOwnedRootDict.reset(new CPDF_Dictionary()); | 104 m_pOwnedRootDict.reset(new CPDF_Dictionary()); |
95 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict->GetObjNum()); | 105 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict->GetObjNum()); |
96 m_pRootDict = m_pOwnedRootDict.get(); | 106 m_pRootDict = m_pOwnedRootDict.get(); |
97 m_PageList.SetSize(3); | 107 m_PageList.SetSize(3); |
98 } | 108 } |
99 | 109 |
100 private: | 110 private: |
101 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; | 111 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 const uint32_t obj_num = page_stub->GetObjNum(); | 204 const uint32_t obj_num = page_stub->GetObjNum(); |
195 const int test_page_num = 33; | 205 const int test_page_num = 33; |
196 | 206 |
197 EXPECT_FALSE(document.IsPageLoaded(test_page_num)); | 207 EXPECT_FALSE(document.IsPageLoaded(test_page_num)); |
198 EXPECT_EQ(nullptr, document.GetPage(test_page_num)); | 208 EXPECT_EQ(nullptr, document.GetPage(test_page_num)); |
199 | 209 |
200 document.SetPageObjNum(test_page_num, obj_num); | 210 document.SetPageObjNum(test_page_num, obj_num); |
201 EXPECT_TRUE(document.IsPageLoaded(test_page_num)); | 211 EXPECT_TRUE(document.IsPageLoaded(test_page_num)); |
202 EXPECT_EQ(page_stub, document.GetPage(test_page_num)); | 212 EXPECT_EQ(page_stub, document.GetPage(test_page_num)); |
203 } | 213 } |
OLD | NEW |