Make some CPDF_Parser methods private or mark them as ForTesting
Encapsulate more code.
Change-Id: I8a7516028a2417d1fbee11fa01d796e3951786cd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/122650
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h
index d659c9b..9f8b985 100644
--- a/core/fpdfapi/parser/cpdf_parser.h
+++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -67,7 +67,6 @@
Error StartLinearizedParse(RetainPtr<CPDF_ReadValidator> validator,
const ByteString& password);
- void SetPassword(const ByteString& password) { m_Password = password; }
ByteString GetPassword() const { return m_Password; }
// Take the GetPassword() value and encode it, if necessary, based on the
@@ -75,7 +74,6 @@
ByteString GetEncodedPassword() const;
const CPDF_Dictionary* GetTrailer() const;
- CPDF_Dictionary* GetMutableTrailerForTesting();
uint32_t GetTrailerObjectNumber() const;
// Returns a new trailer which combines the last read trailer with the /Root
@@ -88,7 +86,6 @@
uint32_t GetRootObjNum() const;
uint32_t GetInfoObjNum() const;
RetainPtr<const CPDF_Array> GetIDArray() const;
- RetainPtr<const CPDF_Dictionary> GetRoot() const;
RetainPtr<const CPDF_Dictionary> GetEncryptDict() const;
RetainPtr<CPDF_Object> ParseIndirectObject(uint32_t objnum);
@@ -104,24 +101,27 @@
int GetFileVersion() const { return m_FileVersion; }
bool IsXRefStream() const { return m_bXRefStream; }
- RetainPtr<CPDF_Object> ParseIndirectObjectAt(FX_FILESIZE pos,
- uint32_t objnum);
-
FX_FILESIZE GetDocumentSize() const;
uint32_t GetFirstPageNo() const;
const CPDF_LinearizedHeader* GetLinearizedHeader() const {
return m_pLinearized.get();
}
- const CPDF_CrossRefTable* GetCrossRefTable() const {
- return m_CrossRefTable.get();
- }
-
bool xref_table_rebuilt() const { return m_bXRefTableRebuilt; }
std::vector<unsigned int> GetTrailerEnds();
bool WriteToArchive(IFX_ArchiveStream* archive, FX_FILESIZE src_size);
+ const CPDF_CrossRefTable* GetCrossRefTableForTesting() const {
+ return m_CrossRefTable.get();
+ }
+
+ CPDF_Dictionary* GetMutableTrailerForTesting();
+
+ RetainPtr<CPDF_Object> ParseIndirectObjectAtForTesting(FX_FILESIZE pos) {
+ return ParseIndirectObjectAt(pos, 0);
+ }
+
void SetLinearizedHeaderForTesting(
std::unique_ptr<CPDF_LinearizedHeader> pLinearized);
@@ -157,11 +157,17 @@
bool LoadLinearizedAllCrossRefTable(FX_FILESIZE main_xref_offset);
bool LoadLinearizedAllCrossRefStream(FX_FILESIZE main_xref_offset);
Error LoadLinearizedMainXRefTable();
+
const CPDF_ObjectStream* GetObjectStream(uint32_t object_number);
+ RetainPtr<const CPDF_Dictionary> GetRoot() const;
+
// A simple check whether the cross reference table matches with
// the objects.
bool VerifyCrossRefTable();
+ RetainPtr<CPDF_Object> ParseIndirectObjectAt(FX_FILESIZE pos,
+ uint32_t objnum);
+
// If out_objects is null, the parser position will be moved to end subsection
// without additional validation.
bool ParseAndAppendCrossRefSubsectionData(
@@ -173,6 +179,7 @@
bool InitSyntaxParser(RetainPtr<CPDF_ReadValidator> validator);
bool ParseFileVersion();
+ void SetPassword(const ByteString& password) { m_Password = password; }
std::unique_ptr<CPDF_SyntaxParser> m_pSyntax;
std::unique_ptr<ParsedObjectsHolder> m_pOwnedObjectsHolder;
diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
index f915e26..5af3e9f 100644
--- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
@@ -38,7 +38,8 @@
CPDF_CrossRefTable::ObjectInfo GetObjInfo(const CPDF_Parser& parser,
uint32_t obj_num) {
- const auto* info = parser.GetCrossRefTable()->GetObjectInfo(obj_num);
+ const auto* info =
+ parser.GetCrossRefTableForTesting()->GetObjectInfo(obj_num);
return info ? *info : CPDF_CrossRefTable::ObjectInfo();
}
@@ -159,7 +160,9 @@
for (size_t i = 0; i < std::size(versions); ++i) {
EXPECT_EQ(versions[i], GetObjInfo(parser, i).gennum);
}
- const CPDF_CrossRefTable* cross_ref_table = parser.GetCrossRefTable();
+
+ const CPDF_CrossRefTable* cross_ref_table =
+ parser.GetCrossRefTableForTesting();
ASSERT_TRUE(cross_ref_table);
EXPECT_EQ(0u, cross_ref_table->trailer_object_number());
}
@@ -336,7 +339,7 @@
EXPECT_EQ(100940, parser.ParseStartXRef());
RetainPtr<CPDF_Object> cross_ref_stream_obj =
- parser.ParseIndirectObjectAt(100940, 0);
+ parser.ParseIndirectObjectAtForTesting(100940);
ASSERT_TRUE(cross_ref_stream_obj);
EXPECT_EQ(75u, cross_ref_stream_obj->GetObjNum());
}
@@ -358,7 +361,7 @@
EXPECT_EQ(100940, parser.ParseStartXRef());
RetainPtr<CPDF_Object> cross_ref_stream_obj =
- parser.ParseIndirectObjectAt(100940, 0);
+ parser.ParseIndirectObjectAtForTesting(100940);
ASSERT_TRUE(cross_ref_stream_obj);
EXPECT_EQ(75u, cross_ref_stream_obj->GetObjNum());
}
@@ -379,7 +382,8 @@
parser.InitTestFromBufferWithOffset(data, kTestHeaderOffset);
EXPECT_TRUE(parser.ParseLinearizedHeader());
- const CPDF_CrossRefTable* cross_ref_table = parser.GetCrossRefTable();
+ const CPDF_CrossRefTable* cross_ref_table =
+ parser.GetCrossRefTableForTesting();
ASSERT_TRUE(cross_ref_table);
EXPECT_EQ(0u, cross_ref_table->trailer_object_number());
}
@@ -397,8 +401,8 @@
CPDF_TestParser parser;
ASSERT_TRUE(parser.InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::FORMAT_ERROR, parser.StartParseInternal());
- ASSERT_TRUE(parser.GetCrossRefTable());
- EXPECT_EQ(0u, parser.GetCrossRefTable()->objects_info().size());
+ ASSERT_TRUE(parser.GetCrossRefTableForTesting());
+ EXPECT_EQ(0u, parser.GetCrossRefTableForTesting()->objects_info().size());
}
class ParserXRefTest : public testing::Test {
@@ -448,8 +452,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
// This should be the only object from table. Subsequent objects have object
// numbers that are too big.
@@ -489,7 +494,8 @@
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- const CPDF_CrossRefTable* cross_ref_table = parser().GetCrossRefTable();
+ const CPDF_CrossRefTable* cross_ref_table =
+ parser().GetCrossRefTableForTesting();
ASSERT_TRUE(cross_ref_table);
EXPECT_EQ(7u, cross_ref_table->trailer_object_number());
const auto& objects_info = cross_ref_table->objects_info();
@@ -626,8 +632,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
CPDF_CrossRefTable::ObjectInfo expected_result[2] = {
{.type = CPDF_CrossRefTable::ObjectType::kNormal, .pos = 15},
@@ -664,8 +671,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
CPDF_CrossRefTable::ObjectInfo expected_result[6] = {
{.type = CPDF_CrossRefTable::ObjectType::kNormal, .pos = 0},
@@ -706,8 +714,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
CPDF_CrossRefTable::ObjectInfo expected_result[2] = {
{.type = CPDF_CrossRefTable::ObjectType::kNormal, .pos = 0},
@@ -743,8 +752,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
// Although the /Index does not follow the spec, the parser tolerates it.
CPDF_CrossRefTable::ObjectInfo expected_result[3] = {
@@ -782,8 +792,9 @@
ASSERT_TRUE(parser().InitTestFromBuffer(kData));
EXPECT_EQ(CPDF_Parser::SUCCESS, parser().StartParseInternal());
EXPECT_FALSE(parser().xref_table_rebuilt());
- ASSERT_TRUE(parser().GetCrossRefTable());
- const auto& objects_info = parser().GetCrossRefTable()->objects_info();
+ ASSERT_TRUE(parser().GetCrossRefTableForTesting());
+ const auto& objects_info =
+ parser().GetCrossRefTableForTesting()->objects_info();
const CPDF_CrossRefTable::ObjectInfo expected_result[3] = {
{.type = CPDF_CrossRefTable::ObjectType::kNormal, .pos = 0},