| // Copyright 2026 The PDFium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "core/fpdfapi/page/cpdf_page.h" | |
| #include "constants/page_object.h" | |
| #include "core/fpdfapi/page/test_with_page_module.h" | |
| #include "core/fpdfapi/parser/cpdf_dictionary.h" | |
| #include "core/fpdfapi/parser/cpdf_name.h" | |
| #include "core/fpdfapi/parser/cpdf_null.h" | |
| #include "core/fpdfapi/parser/cpdf_reference.h" | |
| #include "core/fpdfapi/parser/cpdf_string.h" | |
| #include "core/fpdfapi/parser/cpdf_test_document.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| using CPDF_PageTest = TestWithPageModule; | |
| TEST_F(CPDF_PageTest, IsValidPageDict) { | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(nullptr)); | |
| auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>(); | |
| page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Page"); | |
| EXPECT_TRUE(CPDF_Page::IsValidPageDict(page_dict)); | |
| } | |
| TEST_F(CPDF_PageTest, IsValidPageDictWrongTypes) { | |
| auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>(); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Font"); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| page_dict->SetNewFor<CPDF_String>(pdfium::page_object::kType, "Page"); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| page_dict->SetNewFor<CPDF_Null>(pdfium::page_object::kType); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| } | |
| TEST_F(CPDF_PageTest, IsValidPageDictReference) { | |
| CPDF_TestDocument doc; | |
| auto page_dict = doc.NewIndirect<CPDF_Dictionary>(); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Page"))); | |
| EXPECT_TRUE(CPDF_Page::IsValidPageDict(page_dict)); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Pages"))); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Null>())); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict)); | |
| } | |
| TEST_F(CPDF_PageTest, IsValidPageDictLoose) { | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(nullptr)); | |
| auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>(); | |
| EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Page"); | |
| EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| } | |
| TEST_F(CPDF_PageTest, IsValidPageDictLooseWrongTypes) { | |
| auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>(); | |
| page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Font"); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| page_dict->SetNewFor<CPDF_String>(pdfium::page_object::kType, "Page"); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| page_dict->SetNewFor<CPDF_Null>(pdfium::page_object::kType); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| } | |
| TEST_F(CPDF_PageTest, IsValidPageDictLooseReference) { | |
| CPDF_TestDocument doc; | |
| auto page_dict = doc.NewIndirect<CPDF_Dictionary>(); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Page"))); | |
| EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Pages"))); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| page_dict->SetNewFor<CPDF_Reference>( | |
| pdfium::page_object::kType, &doc, | |
| doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Null>())); | |
| EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict)); | |
| } |